2014-11-08 151 views
-2

我有一个php表单类,用于验证表单输入。但是,在实现isEmailEmpty()函数时,我遇到了一些意想不到的行为。这里是我的代码:php bool函数返回字符串而不是bool

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 = "[email protected]"; 
$userPassword = "rootatoot"; 
$form = new Form($userEmail, $userPassword); 

因为我isEmailValid()函数返回一个布尔值,我期望得到一个布尔返回值,即在执行时为true/false或1/0。但是,情况并非如此。相反,当表达式计算结果为true时,我会得到测试的电子邮件值的字符串输出。例如,给定上面实例化的对象,语句echo $form->isEmailValid()输出[email protected]。运行gettype($form->isEmailValid)返回string,这也不是预期的。更令人好奇的是:isPasswordValid()函数不会以这种方式表现。如果密码实际上有效,则运行$form->isPasswordValid()返回1。如预期的那样,运行gettype($form->isPasswordValid())返回boolean。我的代码仍然按预期工作,这也很有趣。例如,块

if ($form->isEmailValid()) { 
     echo "Valid email"; 
} else { 
     echo "Invalid email"; 
} 

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

  1. 什么是负责布尔函数返回一个字符串?例如,这是设计还是其他一些流程的副产品?
  2. 有没有这种意外的返回值可能导致问题的任何情况?或者系统是否理解这个评估,并且始终如此处理?我的代码现在工作正常,但我不认为它牵强预测意外的返回值迟早会引起一些问题。

我很欣赏您提供的任何信息。谢谢!

+1

如果过滤器失败,'filter_var'返回布尔值false;否则它返回过滤的数据 - http://php.net/manual/en/function.filter-var.php – andrewsi 2014-11-08 19:40:54

回答

1

由于我isEmailValid()函数返回一个布尔值

好,没有,它没有

the documentation of filter_var

返回过滤数据,或FALSE如果过滤器将失败。

if逻辑仍然工作,因为一个非空的字符串是“truthy”,意思是it will be treated the same as truewhen used as a condition

为了有isEmailValid实际上返回一个布尔值,你可以在你的代码改成这样:

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

我明白了。如果我使用无效的电子邮件输入执行该功能,则不会输出任何内容。甚至不是'假'。没有输出自动评估为false? – wheresmyspaceship 2014-11-08 19:49:57

+1

@ wheresmyspaceship当'false'被'echo'转换为一个字符串时,它变成一个空字符串。如果你想查看单词“真”或“假”,使用'var_dump()'。 – Barmar 2014-11-08 19:56:35

+0

非常感谢你@Barmar! – wheresmyspaceship 2014-11-08 19:57:54

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()。没有有效的电子邮件应该是虚假的。

+0

我已经说过了。 – 2014-11-08 19:48:20

+0

我们都在同一时间发布。 – Barmar 2014-11-08 19:48:54

+0

谢谢@Barmar!我很乐意接受你的回答,但@Lightness轨道比赛在那里得到了更快。 – wheresmyspaceship 2014-11-08 19:53:01