PHP中的is_null($ x)vs $ x === null

Exp*_*lls 129 php isnull

可能重复:
is_null($ var)和($ var === null)之间有什么区别?

PHP有两个(我知道,如果算了三个isset())方法来确定一个值是否为null:is_null()=== null.我听说过,但没有证实,这=== null更快,但在代码审查中有人强烈建议我使用,is_null()因为它是专门为空评估目的而设计的.他也开始谈论数学或其他什么.

无论如何,is_null()显然较慢的事实也让我相信它做得更多=== null而且可能更受欢迎.有没有理由使用其中一个?总是首选吗?怎么样isset()

作为可能无法解决这个问题的附录,那么isset()对战is_null()呢?似乎所有人isset()都会压制通知,所以除非你真的想要一个未定义变量的通知,否则任何理由都可以使用is_null()?如果你知道变量当时被初始化了怎么样?

最后,是否有任何数学理由,更喜欢is_null()=== null?关于null无法比较的东西?

Nik*_*kiC 185

绝对没有在两者之间的功能差异is_null=== null.

唯一的区别是,这is_null是一个功能,因此

  1. 稍微慢一点(函数调用开销)
  2. 可以用作回调,例如array_map('is_null', $array).

就个人而言,我null ===随时都可以使用,因为它更符合false ===true ===检查.

如果你愿意,你可以检查代码:is_identical_function(===)和php_is_type(is_null)做同样的事情的IS_NULL情况.


相关isset()语言构造在执行null检查之前检查变量是否实际存在.所以isset($undefinedVar)不会发出通知.

还要注意,即使值是isset()有时可能返回- 这是在重载对象上使用时的情况,即如果对象定义了一个即使偏移量返回的/ 方法(这实际上很常见,因为人们使用在/ ).truenulloffsetExists__issettruenullarray_key_existsoffsetExists__isset

  • 根据文档中的评论,`is_null()`现在在PHP7中比`=== NULL`略快,但两者之间的差异远小于以前的版本,不值得担心. (5认同)

jpr*_*itt 12

正如其他人所说,使用===和之间存在时差is_null().做了一些快速测试并得到了这些结果:

<?php

//checking with ===
$a = array();
$time = microtime(true);
for($i=0;$i<10000;$i++) {
    if($a[$i] === null) {
         //do nothing
    }
}
echo 'Testing with === ', microtime(true) - $time, "\n";

//checking with is_null()
$time = microtime(true);
for($i=0;$i<10000;$i++) {
    if(is_null($a[$i])) {
         //do nothing
    }
}
echo 'Testing with is_null() ', microtime(true) - $time;
?>
Run Code Online (Sandbox Code Playgroud)

给出结果

使用=== 0.0090668201446533进行测试

使用is_null()0.013684034347534进行测试

查看实际代码

  • 你在一个循环中进行了10000次操作,时间差异小于5毫秒.没关系.它永远不会重要.没有人试图提高他们的应用程序的性能曾经宣称"诅咒,如果我只能从这个空检查削减半微秒!",没有人会这样做. (29认同)
  • @MarkAmery我会以同样的代价去做更好的表现,并且永远都会.在50k +文件应用程序中,小心护理比护理更糟糕. (15认同)
  • 我认为这里的重点是,如果你已经使用了is_null,就没有必要重构了,但是从现在开始使用它是没有意义的,如果你得到我的漂移. (9认同)
  • 程序执行时间往往遵循帕累托分布,即约20%的代码库负责运行时间的约80%(当它不是10/90甚至1/99时).所以,你说,这种微观优化通常不会给你带来太大的影响. (3认同)

mAu*_*mAu 6

我不能说使用is_null或更好=== null。但是isset在数组上使用时要注意。

$a = array('foo' => null);

var_dump(isset($a['foo'])); // false
var_dump(is_null($a['foo'])); // true
var_dump(array_key_exists('foo', $a)); // true
Run Code Online (Sandbox Code Playgroud)


Mar*_*c B 5

它们都有自己的位置,尽管只有isset()可以避免未定义的变量警告:

$ php -a
Interactive shell

php > var_dump(is_null($a));
PHP Notice:  Undefined variable: a in php shell code on line 1
bool(true)
php > var_dump($a === null);
PHP Notice:  Undefined variable: a in php shell code on line 1
bool(true)
php > var_dump(isset($a));
bool(false)
php >
Run Code Online (Sandbox Code Playgroud)


Thi*_*ter 5

您需要isset()如果变量可能是没有定义。当没有定义的变量或返回false === null(是的,这丑陋的)。只有isset()empty()如果变量或数组元素不存在不引发E_NOTICE。

is_null和之间没有真正的区别=== null。我认为===要好得多,但是当您例如call_user_func出于某种可疑原因需要使用时,您必须使用is_null.


PiT*_*ber 5

===并且is_null是一样的。

根据此评论 is_null仅慢 250ns。我认为是因为函数比运算符慢。