在 PHP 中,is_null ($x) vs $x = = = null

可能的复制品:
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

50249 次浏览

它们都有自己的位置,不过只有 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 >

如果可能没有定义变量,则需要 isset()。当没有定义变量或者 === null(是的,它是 那个丑陋的)时,它返回 false。如果变量或数组元素不存在,则只有 isset()empty()不引发 E _ NOTICE。

is_null=== null之间实际上没有什么区别。我认为 ===要好得多,但是当你因为一些可疑的原因需要使用 call_user_func时,你必须使用 is_null

PHP 文档is_null, === null, isset上进行了很好的讨论和实验,特别是阅读了评论部分。

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()有时可能返回 true,即使它的值是 null-这是在一个重载对象上使用的情况,即如果对象定义了一个 offsetExists/__isset方法返回 true,即使偏移量是 null(这实际上是相当常见的,因为人们在 offsetExists/__isset中使用 array_key_exists)。

===is_null是一样的。

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

我不能说是否更好地使用 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

正如其他人所说,使用 ===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;
?>

给出结果

使用 = = = 0.0090668201446533进行测试

使用 is _ null ()0.013684034347534进行测试

查看运行中的代码