10

虽然我相信答案是肯定的,但我在遗留代码中看到了很多以下内容,我怀疑自己。我要求社区进行健全性检查。

旧代码

if (is_null($result) || !$result) {

重构代码

if (!$result) {

注意:我知道如果$result未设置,这将引发通知。

问题

这段代码在逻辑上是等价的吗?

代码测试

我测试了PHP 错误值的所有组合,但没有收到Not equal for ...

$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
$
4

4 回答 4

5

null变量将在布尔上下文中求值false。所以这些语句在逻辑上是等价的——当变量为空时,它会被!$result语句捕获。

用于empty()防止通知级别的警告:

if (!empty($result)) {
   // do something
}
于 2012-11-27T16:51:48.467 回答
4

是的,两个片段是等效的。is_null定义为:

如果 var 为 null,则返回 TRUE,否则返回 FALSE。

文档还清楚地表明,is_null当变量未定义时会抛出警告,就像对$result. 如果$result未设置,is_null($result)则为真,因此您会收到一个警告 - 与您的行为相同!$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因此,没有必要进一步区分(例如,通过测试0""等)。

于 2012-11-27T16:54:55.057 回答
1

由于http://php.net/is_null调用is_null($var)应该与$var === NULL.

在测试!$var值时,任何 null、空、不存在/未设置或零值都将转换为 boolean false和任何其他转换为 boolean true

因此调用(is_null($result) || !$result)while$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';
于 2012-11-27T16:56:38.667 回答
0

代码在逻辑上等价于:

is_null(null) === true
and
!null === true

是的,正如 leepowers 所说,使用empty()

于 2012-11-27T16:54:42.663 回答