php bool函数返回字符串而不是bool

时间:2014-11-08 19:39:27

标签: php string class boolean

我有一个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()函数返回一个bool,我希望在执行时收到一个布尔返回值,即true / false或1/0。但事实并非如此。相反,当表达式求值为true时,我得到测试的电子邮件值的字符串输出。例如,给定上面实例化的对象,语句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";
}

始终提供正确的输出。即使我的代码按预期运行,了解幕后发生的事情以及原因仍然很重要。所以,我对这种行为的疑问是:

  1. 返回字符串的bool函数负责什么?例如,这是设计还是其他一些过程的副产品?
  2. 是否存在此意外返回值可能导致问题的情况?或者系统是否理解此评估并始终相应地处理它?我的代码现在工作正常,但我认为它不会过早地预测意外的返回值会导致一些问题迟早。
  3. 我感谢您提供的任何信息。谢谢!

2 个答案:

答案 0 :(得分:1)

  

因为我的isEmailValid()函数返回一个bool

嗯,不,它没有

来自the documentation of filter_var

  

返回过滤后的数据,如果过滤器失败,则返回FALSE

您的if逻辑仍然有效,因为非空字符串是" truthy",意思是it will be treated the same as true when used as a condition

为了让isEmailValid 实际返回布尔值,您可以将代码更改为:

public function isEmailValid()
{
   return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL) !== FALSE;
}

答案 1 :(得分:0)

filter_var不返回布尔值,如果值有效则返回值,否则返回false。因此,您可以将您的功能重写为:

public function isEmailValid() {
    return !!filter_var($this->userEmail, FILTER_VALIDATE_EMAIL);
}

两次使用!会将值转换为布尔值。

或者,和其他功能一样,您可以写:

public function isEmailValid() {
    return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL) ? true : false;
}

在其他函数中不需要条件运算符,因为它们使用的运算符返回布尔值,例如你可以写:

public function isEmailEmpty() {
    return ($this->userEmail == "" || $this->userEmail == null);
}

要回答第二个问题,如果你总是在布尔上下文中使用你的函数,例如if(),那应该不是问题。没有有效的电子邮件应该是假的。