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

php bool函数返回字符串而不是bool,php,string,class,boolean,Php,String,Class,Boolean,我有一个php表单类,用于验证表单输入。但是,在实现isEmailEmpty()函数时,我遇到了一些意外行为。这是我的密码: class Form { var $userEmail; var $userPassword; var $hashedPassword; var $requiredPassLength = 6; public function __construct($userEmail, $userPassword) { $this->userEmail = $this

我有一个php表单类,用于验证表单输入。但是,在实现
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()
函数返回布尔值,我希望在执行时收到一个布尔返回值,即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";
}
始终提供正确的输出。尽管我的代码按预期运行,但理解幕后发生的事情及其原因仍然很重要。因此,关于这种行为,我的问题是:

  • bool函数返回字符串的原因是什么?例如,这是设计还是其他过程的副产品
  • 是否存在此意外返回值可能导致问题的情况?或者系统是否理解此评估并始终按相应方式处理?我的代码现在运行良好,但我认为预测意外的返回值迟早会导致一些问题并不牵强 非常感谢您提供的任何信息。谢谢

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

    嗯,不,它没有

    发件人:

    返回筛选数据,如果筛选失败,则返回
    FALSE

    您的
    if
    逻辑仍然有效,因为非空字符串是“truthy”,意思是

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

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

    filter\u 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()
    ,那么这应该不是问题。任何有效的电子邮件都不应该是虚假的。

    filter\u var
    如果筛选失败,则返回布尔值false;否则它将返回过滤后的数据-我明白了。如果使用无效的电子邮件输入执行函数,则不会输出任何内容。甚至不“假”。没有输出自动计算为false吗?@wheresmyspaceship当
    false
    通过
    echo
    转换为字符串时,它将成为空字符串。如果要查看单词
    true
    false
    ,请使用
    var\u dump()