is_null($ var)和($ var === null)有什么区别?


83

两者之间有什么区别吗?

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

还有这个?

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

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


5
您可能会认为===运算符会更快,因为它不是显式函数……但是我感到一两次惊讶。
2011年

Answers:


30

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

这实际上取决于您如何看待自己的状况。

===用于严格的数据比较。NULL只有一个“值”,因此可与NULL(这是null“值”的PHP常量)进行比较。

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

真正取决于您的选择。


2
感谢您解释按值比较与按类型比较。
kijin 2011年

4
我更喜欢该is_null变体,因为它很容易被意外使用== null而不是=== null。由于== nullempty(请参阅其他答案)相同,因此与简单易读相比,这为程序员(尤其是初级和中级)错误带来了更大的潜力is_null
ryanm '17

101

true

false

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

摘要:🔸♦️🔸

  • empty 相当于 ==null
  • is_null 相当于 ===null
  • issetis_null和的逆===null

12
我真的很喜欢这张桌子。
Cheok Yan Cheng 2014年

3
它可能使表稍微清楚有一个名为第一列$v代表一些通用的变量,然后其他人isset($v)is_null($v)$v===null等等
Brandin

@白兰地谢谢你的建议。随时编辑答案。
PHPst 2014年

4
@Pacerier明确表示它们是等效的,因此在功能上没有区别。
PHPst 2015年

1
isset不会抱怨未定义的变量,它将返回false。使用is_null=== null将导致通知。
user1431317

17

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


3
尽管起初===可能会更快,但PHP优化程序应该对此进行补救。
foo

10
我感觉is_null实际上不太清楚。尽管它看起来不错, $v === null但毫无疑问,比较是使用严格的语义完成的,但是使用is_null($v),有些编码人员会怀疑它是使用===还是==语义。
山羊

4
@goat,ish1301,也is_null可以完全删除或重新定义,但=== null始终可以使用。
Pacerier's

@Pacerier,而您的示例很有趣,可能是有人安装了runkit pecl软件包,然后对其进行了设置以允许删除内置函数,然后删除is_null,而不用任何东西替换它,该值非常接近nil;如果为null,则为null你比较喜欢。我能想到的一个人要删除is_null的唯一方案是,他们是否想全局更改null比较的行为。例如; 对于未设置,返回false而不是true;在这种情况下,实际上只有在以is_null编写代码的情况下才有可能。
kaan_a

7

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

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

$arrayWithoutNullValues然后将存储仅包含 null值的数组。
PointedEars 2012年

5

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

因此,拨打电话的is_null时间比===在我的计算机上拨打电话慢0.000007s 。

我会发现更有用的优化方法。


我的代码:

<?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;

1
有趣的是,PHP / 7似乎已经解决了这一问题,现在的性能几乎相同。实际上,is_null()在7.1.9 Win32下我的计算机中的速度稍快。
阿尔瓦罗·冈萨雷斯

@ÁlvaroGonzález我注意到了同样的事情。两种功能之间的差异可以忽略不计。(is_null:0.54486592610677,=== null:0.7440135592506)在10,000次操作。测试进行了30次,这些数字是平均值。
贾斯汀E


0

is_null($var)$var===null... 37.8 ms和2.6 ms慢14倍。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.