PHP的is_null()和==null

58
在PHP中,is_null==null之间有什么区别?它们何时会返回true?

3
好的,我会尽力进行翻译。以下是需要翻译的内容:This is not a duplicate - the other question asks about "===", not "=="。这并不是一个重复的问题——另一个问题询问的是"===",而非"=="。 - derekdreery
6个回答

71

is_null 等同于 === null。当变量为null(或未设置)时,两者都返回true。

请注意,我使用的是 === 而不是 == === 比较类型和值。


如果变量未设置,is_null() 返回 true,但也会抛出“注意:未定义的变量”错误。为了避免这种情况,您可以使用等效的 !isset($var),唯一的缺点是您只能将变量传递给 isset() - Gras Double
@Rocket,当你说“相同”时,你是指它们生成的错误和警告方面也是完全相同吗? - Pacerier
@RocketHazmat,我的意思是在Zend和HHVM中。基本上,我的意思是,它们在PHP中是否被视为同义词 - Pacerier
2
@Pacerier 如果你需要知道 isset($undefined)is_null($undefined) 的确切实现方式,那么通过阅读源代码很容易就能得出答案。如果它像鸭子一样嘎嘎叫,走路也像鸭子一样。 - Justin Mitchell
2
如果讨论了=====之间的区别,这个答案会更好,因为OP问到了==。请参考Daniel Ribeiro的答案,其中提供了一些测试用例来帮助展示它们之间的差异。此外,还可以参考dleiftah的答案,其中提供了链接到详细演示差异的图表。 - ToolmakerSteve
显示剩余3条评论

67

这样你就能更好地理解:

$a = null;
$b = 0;

is_null($a) // TRUE
$a == null  // TRUE
$a === null // TRUE
is_null($b) // FALSE
$b == null  // TRUE
$b === null // FALSE

13

5

2
仅供参考,为了明确起见,那是一张比较性能的图表;我点击链接以查看是否存在某些微妙的情况,其中它们在语义上有所不同,但这不是它所涉及的内容。 - ToolmakerSteve

5

===null是PHP发明者Rasmus Lerdorf推荐的。Rasmus表示,与isset的测试相比,测试null的速度更快。他的建议足以让我们认真考虑这种差异。如果您在一个Web页面请求中有一个小循环多次执行相同的代码,则差异将非常显着。

更新:一些is_null和严格比较的速度测试:

PHP 5.5.9
is_null - float(2.2381200790405)
===     - float(1.0024659633636)

PHP 7.0.0-dev
is_null - float(1.4121870994568)
===     - float(1.4577329158783)

7
当你说某人说了某事时,需要提供链接或[需要引用来源](http://xkcd.com/285)。 - Pacerier
就此而言,这并不是OP所要求的内容。isset有不同的含义。 - ToolmakerSteve
@ToolmakerSteve 在最佳答案(标记)中已经很好地描述了返回值的主题。这是有关速度差异的补充说明。 - Akim Kelar
@AkimKelar - 我想指出你的回答是关于isset===null之间速度差异的,这并不能帮助我们决定是否使用is_null===null,因为这是这个问题的主题。(以防有人没有仔细阅读!) - ToolmakerSteve
@ToolmakerSteve,难道不明显吗?任何非严格比较方法(尤其是方法)都不会比严格比较更快,对吧?如果不是的话,我会添加一些速度测试来回答。 - Akim Kelar

4

== 不会检查类型,因此在某些情况下,类似于字符串 '' 或字符串 'null' 可能会被认为等于 null。

使用三个等号 ===,不仅可以检查两个值是否相等,还可以检查它们是否是相同的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接