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