繁体   English   中英

PHP:使用带有!$ var或isset($ var)的is_null()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM