153

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

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

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

作为可能无法解决此问题的附录,isset()vs.怎么样is_null()?似乎所有isset()要做的就是抑制通知,所以除非你真的想要一个未定义变量的通知,否则有什么理由使用is_null()呢?如果您知道当时变量已初始化,那又如何呢?

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

4

7 回答 7

216

和之间的功能绝对没有区别。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

于 2011-11-22T15:07:45.210 回答
17

正如其他人所说,使用===和之间存在时间差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 进行测试

查看实际代码

于 2011-11-22T15:11:12.867 回答
6

它们都有自己的位置,尽管只有 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 >
于 2011-11-22T15:00:05.577 回答
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
于 2011-11-22T15:08:38.910 回答
5

isset()如果变量可能未定义,则需要。当变量未定义或=== null(是的,这很难看)时,它返回 false。如果变量或数组元素不存在,则仅isset()且不引发 E_NOTICE。empty()

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

于 2011-11-22T15:00:33.813 回答
5

===is_null是一样的。

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

于 2011-11-22T15:08:03.500 回答
2

PHP文档对is_null, === null, isset. 特别是阅读评论部分。

于 2011-11-22T15:02:30.733 回答