只是一个简单的问题 - 而且我确信它非常基本!
我有以下代码:
function checkThings($foo, $bar) {
...
if ($valid) {
return $results;
} else {
return false;
}
}
另一方面,我正在做
$check = checkThings($foo, $bar);
if ($check === false) {
echo "Error";
} else {
echo $check;
}
写下面的内容是否相同?
$check = checkThings($foo, $bar);
if (!$check) {
echo "Error";
} else {
echo $check;
}
如果两种方法都正确,哪种方法是首选方法?
谢谢:)
答案 0 :(得分:50)
三等运算符是类型敏感的。所以当你检查:
if ($check === false)
...只有$check
是布尔值“false”才会成立。 Wheras
if ($check == false)
...不是专门检查布尔值false,而是“falsey”值。 PHP中的False等于零,null为“falsey”,空字符串为"" == false == null
,但"" !== false !== null
)。所以:
$check = 0;
if ($check == false)
...评估为真。
!
前缀运算符相当于==
。因此,当零必须是布尔值为false的离散值时,!
和==
运算符是不够的。
在此处查看比较运算符的文档:http://php.net/manual/en/language.operators.comparison.php
最佳做法是使您的条件检查尽可能具体。这不仅是为了避免您的逻辑中的潜在疏忽,而且还为未来的开发人员提供更易于维护的代码。想象一下遇到一行代码:
if (check_something($variable)) {
// do stuff
}
我可以假设check_something
函数返回一个布尔值为true。但是,除非我去挖掘check_something
函数,否则它 也会返回一个非空字符串,一个数字......谁知道!这样做要清楚得多:
if (check_something($variable) === true) {
// do stuff
}
现在,只需查看,我就知道check_something
函数 预期 可返回真值。我可能不知道这个函数是做什么的,但至少它确切地说明了它返回的内容。另一个常见的例子是你所看到的:
if (!$_GET['value']) {
// do something
}
这是一个宠儿。条件陈述应始终清楚地比较事物。所以,你想要这样做:
if (array_key_exists('value', $_GET) !== false && $_GET['value'] === '1') {
// do something
}
现在,您可以告诉我,我不仅要检查查询字符串参数是否存在,还要查看它是否等于特定值。
总之,单!
前缀运算符和==
运算符很少有用且总是不明确的。最好的方法是以一种文档本身的方式编写代码,或者将其翻译成人类语言来表达逻辑。在适当的情况下,使用!==
或===
进行直接比较是一种好习惯,良好做法,并且最不可能在代码中产生意外结果。
答案 1 :(得分:7)
=== false检查类型,(!$ check)计算值,并且对于返回的值失败,例如null,''(空字符串)和零(0)
===是最正确的
答案 2 :(得分:4)
它们相似但不完全相同。 !$check
是一个松散的检查器,意味着0
和null
也会评估为真。 ===
是一个严格的检查程序,这意味着它必须是false
。
更深入的解释:PHP Types Comparisons
答案 3 :(得分:0)
==进行值比较,其中===按位进行。
// will return true only when $value = false
if( $value === false )
// will return true when $value = 0, $value = "", $value = null, etc
if( $value == false )
if( !$value )
答案 4 :(得分:0)
我更喜欢你的第二种方法,但先把正面检查(if($ check)代替)。
答案 5 :(得分:0)
在某些情况下,使用单个!
前缀运算符不会带来任何风险,而是要评估的表达式类型始终为布尔值。
例如,下面的表达式
if (!is_array($var)) {
将始终与
相似if (is_array($var) === false) {
这是因为函数is_array始终返回布尔值作为结果。
is_array ( mixed $var ) : bool
某些人可能会发现使用单个!
前缀运算符更容易阅读第一个表达式。唯一需要记住的是,当将表达式与返回的类型混合使用时,由于其他注释已经指出,所以我们可能会得到意想不到的结果。
答案 6 :(得分:0)
如果您要检查多个条件,可以执行以下操作:
function checkThings($foo, $bar)
{
else if ($valid === false)
{
return false;
}
else if ($valid === 1)
{
return 1;
}
else if ($valid === 2)
{
return 2;
}
else if ($valid === 3)
{
return 3;
}
}
但是,当您尝试检查返回哪个值以及运行了哪段代码时,必须使用“ ===”严格检查函数的返回。
答案 7 :(得分:0)
在我从JS Datatable获得值的情况下,我将其检查为:
if($value=='true'){ // or for 'false' }