我有一个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";
}
始终提供正确的输出。即使我的代码按预期运行,了解幕后发生的事情以及原因仍然很重要。所以,我对这种行为的疑问是:
我感谢您提供的任何信息。谢谢!
答案 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()
,那应该不是问题。没有有效的电子邮件应该是假的。