【问题标题】:php bool function returns string instead of boolphp bool 函数返回字符串而不是 bool
【发布时间】: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";
}

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

  1. 布尔函数返回字符串的原因是什么?例如,这是设计使然还是其他过程的副产品?
  2. 是否存在这种意外返回值可能导致问题的情况?或者系统是否理解这个评估并总是相应地处理它?我的代码现在工作正常,但我认为预测意外的返回值迟早会导致一些问题并不牵强。

感谢您提供的任何信息。谢谢!

【问题讨论】:

标签: php string class boolean


【解决方案1】:

因为我的 isEmailValid() 函数返回一个布尔值

嗯,不,它没有

来自the documentation of filter_var

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

您的 if 逻辑仍然有效,因为非空字符串是“真实的”,意思是 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;
}

【讨论】:

  • 我明白了。如果我使用无效的电子邮件输入执行该函数,则不会输出任何内容。甚至没有“错误”。没有输出会自动评估为假吗?
  • @wheresmyspaceship 当falseecho转换为字符串时,就变成了空字符串。如果您想查看truefalse 字样,请使用var_dump()
【解决方案2】:

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;
}

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

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

要回答您的第二个问题,如果您始终在布尔上下文(例如 if())中使用您的函数,这应该不是问题。任何有效的电子邮件都不应该是虚假的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2016-01-10
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2016-10-23
    相关资源
    最近更新 更多