[英]PHP: Using is_null() with !$var or isset($var)
虽然我认为答案是肯定的 ,但我在遗留代码中看到了以下内容,我对此表示怀疑。 我要求社区进行健全检查。
if (is_null($result) || !$result) {
if (!$result) {
注意: 我知道如果没有设置$result
这将抛出通知。
这段代码在逻辑上是等价的吗?
我测试了所有PHP假值的组合而没有收到不等于...。
$false_values = array(false, 0, 0.0, '0', '', null, array(), new stdClass());
foreach ($false_values as $var) {
if (!$var != (is_null($var) || !$var)) {
echo 'Not equal for: ';
var_dump($var);
}
}
$ php check.php
$
null
变量将在布尔上下文中计算为false
。 所以这些语句在逻辑上是等价的 - 当变量为null时,它将被!$result
语句捕获。
使用empty()
来防止通知级警告:
if (!empty($result)) {
// do something
}
是的,两个片段都是等价的。 is_null定义为:
如果var为null,则返回TRUE,否则返回FALSE。
该文档还清楚地表明,当变量未定义时, is_null
会抛出警告,对$result
的简单布尔评估也是如此。 如果未设置$result
,则is_null($result)
为true,因此您会收到一条警告 - 与您一样的行为!$result
。
由于NULL的布尔值评估(不出所料)是假的,我们可以简单地测试出所有有趣的值:
$result is_null($result) !$result is_null($result) || !$result
(unset) true(+warn) true(+warn) true (+warn)
null true true true
false(-y) false true true
true(-ish) false false false
请注意, is_null
和!$result
对于所有评估为false的值以及评估为true的所有值都是相同的。 因此,不需要进一步区分(例如,通过测试0
, ""
等)。
由于http://php.net/is_null ,调用is_null($var)
应与$var === NULL
完全相同。
作为测试!$var
测试一个值,所以任何null,空,不存在/未设置或零值都会转换为布尔值false,而其他任何值都转换为布尔值true 。
因此调用(is_null($result) || !$result)
而$result
将是您的$false_values
任何一个将导致:
false : (is_null(false) || !false) => (false || true) => true
0 : (is_null(0) || !0) => (false || true) => true
0.0 : (is_null(0.0) || !0.0) => (false || true) => true
'0' : (is_null('0') || !'0') => (false || true) => true
null : (is_null(null) || !null) => (true || true) => true
array() : (is_null(array()) || !array()) => (false || true) => true
new stdClass() : (is_null(new cls) || ! new cls) => (false || true) => true
作为测试!$var
你的测试应该总是为true
这是非常好你没有得到Not equal for
。
如果您想避免通知,可以使用此测试:
if(isset($var) && $var) echo 'true story';
要么
if(!isset($var) || !$var) echo 'this happens if false or not set at all';
代码逻辑等效为:
is_null(null) === true
and
!null === true
是的,并且作为leepowers说使用empty()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.