【问题标题】:What's the difference between is_null($var) and ($var === null)?is_null($var) 和 ($var === null) 有什么区别?
【发布时间】:2011-01-11 20:59:34
【问题描述】:

这有什么区别吗……

if (is_null($var)) {
    do_something();
}

还有这个?

if ($var === null) {
    do_something();
}

在检查变量是否包含空值时,哪种形式更好?有没有我应该注意的边缘情况? (我初始化了所有变量,所以不存在的变量不是问题。)

【问题讨论】:

  • 您会认为=== 运算符会更快,因为它不是一个显式函数……但我曾惊讶过一两次。

标签: php


【解决方案1】:

true

false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|  true |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| false |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     0 |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     1 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
|    \0 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| unset |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|   ""  |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |

总结:?♦️?

  • empty 等价于 ==null
  • is_null 等价于 ===null
  • issetis_null===null 的倒数

重要的一点是emptyisset 如果它们的参数是未定义的变量,则不会触发 PHP 警告。因此,如果您希望始终定义您要测试的变量或数组索引,请使用运算符,否则使用该函数。

【讨论】:

  • 我真的很喜欢这张桌子。
  • 将第一列命名为$v 来表示一些通用变量,然后其他的isset($v)is_null($v)$v===null 等可能会使表格更加清晰。 /跨度>
  • @Brandin 感谢您的建议。随意编辑答案。
  • @Pacerier 明确表示它们是等价的,所以没有功能上的区别。
  • isset 不会抱怨未定义的变量,它会返回 false。使用is_null=== null 将产生通知。
【解决方案2】:

如果变量已初始化(您确实指出了这一点 - 尽管我不能 100% 确定这在这种情况下是否重要。如果未定义变量,两种解决方案都可能会引发警告),它们在功能上是相同的。我认为=== 会稍微快一些,因为它消除了函数调用的开销。

这真的取决于你如何看待自己的状况。

=== 用于严格的数据比较。 NULL 只有一个“值”,所以这适用于与 NULL(它是空“值”的 PHP 常量)进行比较

is_null 正在检查变量是否为 NULL 数据类型。

这取决于你选择,真的。

【讨论】:

  • 感谢您解释按值比较与按类型比较。
  • 我更喜欢is_null 变体,因为很容易不小心使用== null 而不是=== null。由于== nullempty 相同(请参阅其他答案),因此与简单易读的is_null 相比,这给程序员(尤其是初级和中级)带来了更大的潜在错误。
【解决方案3】:

两者完全相同,我使用is_null,因为它使我的代码更具可读性

【讨论】:

  • 虽然 === 一开始可能更快,但 PHP 优化器应该可以解决这个问题。
  • 我觉得is_null其实不太清楚。虽然读起来不错,$v === null 毫无疑问,比较是通过严格的语义完成的,但是对于 is_null($v),一些程序员会怀疑它是使用 === 还是 == 语义。
  • @goat, ish1301,另外,is_null 可以完全是removed or redefined,而=== null 将始终有效。
  • @Pacerier 虽然您的示例很有趣,但可能有人安装了 runkit pecl 包,然后将其设置为允许删除内置函数,然后删除 is_null,所有这些,而不用替换它是非常接近零,如果您愿意,也可以是零。我能想到的唯一一个人想要删除 is_null 的情况是,他们是否想要全局更改 null 比较的行为。例如;未设置返回 false 而不是 true;在这种情况下,实际上只有以 is_null 开头的代码才能编写代码。
  • 它们并不完全相同,一个是带有回调选项的函数,另一个是对值的直接比较
【解决方案4】:

我每次都会使用内置的 PHP 函数而不是运算符比较。

【讨论】:

  • 想更新您的答案以引用一些逻辑或技术原因?就目前而言,这只是一种意见
【解决方案5】:

人们在本次讨论中经常忘记提及的一件事是,如果您只关注严格的类型检查,is_null 将帮助您永远不会在比较运算符中出现拼写错误(== 与 ===)。

【讨论】:

    【解决方案6】:

    我刚刚运行了一个快速基准测试,测试了每个测试一百万次迭代。 is_null 耗时 8 秒完成; === null 拿了 1 个。

    因此,在我的计算机上调用 is_null 比调用 === 慢 0.000007 秒。

    我会发现一些更有用的东西来优化。


    我的代码:

    <?php
    
    $start = time();
    $var = null;
    
    for ($i = 1000000; $i--; ) {
        is_null($var);
    }
    
    echo time() - $start;
    
    $start = time();
    
    for ($i = 1000000; $i--; ) {
        $var === null;
    }
    
    echo time() - $start;
    

    【讨论】:

    • 有趣的是,PHP/7 似乎已经解决了这个问题,现在性能几乎相同;其实is_null()在我7.1.9 Win32下的电脑里会稍微快一点。
    • @ÁlvaroGonzález 我注意到了同样的事情。这两个函数之间的差异可以忽略不计。 (is_null:0.54486592610677,=== null:0.7440135592506)在 10,000 次操作时。测试运行了 30 次,这些数字是平均值。
    【解决方案7】:

    如果 php 有这么多 is_foo() 类型的函数似乎是多余的,那么当您可以只使用标准的比较运算符时,请考虑以编程方式调用函数。

    $arrayOfNullValues = array_filter($myArray, 'is_null');
    

    【讨论】:

    • $arrayWithoutNullValues 将存储一个只有 null 值的数组。
    【解决方案8】:

    is_null($var)$var===null 慢大约 14 倍... 37.8 ms vs. 2.6 ms。

    但实际上我不知道为什么。

    【讨论】:

    • 因为它是一个函数并且有开销(例如设置回调等)。然而在 PHP7 中它是差不多的(报告显示这个函数实际上稍微快了一点)
    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-06-28
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多