【发布时间】:2014-11-08 19:39:26
【问题描述】:
我有一个用于验证表单输入的 php Form 类。但是,在实现isEmailEmpty() 函数时,我遇到了一些意外行为。这是我的代码:
class Form {
var $userEmail;
var $userPassword;
var $hashedPassword;
var $requiredPassLength = 6;
public function __construct($userEmail, $userPassword) {
$this->userEmail = $this->cleanInput($userEmail);
$this->userPassword = $this->cleanInput($userPassword);
}
public function cleanInput($dataField) {
$dataField = trim($dataField);
$dataField = stripslashes($dataField);
$dataField = htmlspecialchars($dataField);
return $dataField;
}
public function isEmailEmpty() {
return ($this->userEmail == "" || $this->userEmail == null) ? true : false;
}
public function isPasswordEmpty() {
return ($this->userPassword == "" || $this->userPassword == null) ? true : false;
}
public function isEmailValid() {
return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL);
}
public function isPasswordValid() {
return (strlen($this->userPassword) >= $this->requiredPassLength) ? true : false;
}
public function hashPassword() {
return $this->hashedPassword = password_hash($this->userPassword, PASSWORD_BCRYPT);
}
// More functions down here...
现在,假设我通过以下方式实例化了一个对象:
$userEmail = "example@example.com";
$userPassword = "rootatoot";
$form = new Form($userEmail, $userPassword);
由于我的 isEmailValid() 函数返回一个布尔值,我希望在执行时收到一个布尔返回值,即真/假或 1/0。然而,事实并非如此。相反,当表达式计算结果为真时,我会得到一个测试过的电子邮件值的字符串输出。例如,给定上面实例化的对象,语句echo $form->isEmailValid() 输出example@example.com。运行gettype($form->isEmailValid) 返回string,这也是意料之外的。更奇怪的是:isPasswordValid() 函数的行为并非如此。如果密码确实有效,则运行 $form->isPasswordValid() 会返回 1。正如预期的那样,运行gettype($form->isPasswordValid()) 返回boolean。有趣的是,我的代码仍然按预期工作。例如,块
if ($form->isEmailValid()) {
echo "Valid email";
} else {
echo "Invalid email";
}
总是给出正确的输出。即使我的代码按预期运行,了解幕后发生的事情以及原因仍然很重要。所以,我对这种行为的问题是:
- 布尔函数返回字符串的原因是什么?例如,这是设计使然还是其他过程的副产品?
- 是否存在这种意外返回值可能导致问题的情况?或者系统是否理解这个评估并总是相应地处理它?我的代码现在工作正常,但我认为预测意外的返回值迟早会导致一些问题并不牵强。
感谢您提供的任何信息。谢谢!
【问题讨论】:
-
filter_var如果过滤器失败,则返回布尔值 false;否则返回过滤后的数据 - php.net/manual/en/function.filter-var.php