is_null($ x)vs $ x === PHP中的null
可能重复:
is_null($ var)和($ var === null)有什么区别?
PHP有两个(我知道的,三个如果计算isset()
)方法来确定一个值是否为空: is_null()
和=== null
。 我听说过,但没有证实, === null
更快,但在代码审查中,有人强烈build议我使用is_null()
因为它专为空值评估目的而devise。 他还开始谈论math或什么的。
无论如何, is_null()
显然慢的事实也使我相信,它比=== null
做的更多,可能是首选。 有没有任何理由使用这个或另一个? 总是首选吗? 那么isset()
呢?
作为可能不会得到这个问题closures的附录,那么isset()
与is_null()
呢? 看来,所有isset()
将做的是压制通知,所以除非你真的想要一个未定义的variables的通知,任何理由使用is_null()
而不是? 如果你知道这个variables是在初始化的时候呢?
最后,是否有任何math原因喜欢is_null()
超过=== null
? 关于null的东西不可比?
is_null
和=== null
之间的function是完全没有区别的。
唯一的区别是is_null
是一个函数,因此
- 稍微慢一点(函数调用开销)
- 可以用作callback,例如
array_map('is_null', $array)
。
就我个人而言,我使用null ===
,因为它更符合false ===
和true ===
检查。
如果你想,你可以检查代码: is_identical_function
( ===
)和php_is_type
( is_null
)对IS_NULL
情况做同样的事情。
相关的isset()
语言构造在进行null
检查之前检查variables是否实际存在。 所以isset($undefinedVar)
不会抛出通知。
还要注意,即使值为null
, isset()
有时也会返回true
– 这是在重载对象上使用的情况,即如果对象定义了即使偏移量为null
也返回true
的offsetExists
/ __isset
方法这实际上是相当普遍的,因为人们在offsetExists
/ __isset
使用array_key_exists
)。
正如其他人所说,使用===
和is_null()
之间有时间差。 做了一些快速testing,得到了这些结果:
<?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; ?>
给出结果
用===testing0.0090668201446533
使用is_null()0.013684034347534进行testing
看到行动中的代码
他们都有自己的位置,虽然只有isset()会避免未定义的variables警告:
$ 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 >
如果variables可能未定义,则需要isset()
。 当variables未定义或=== null
(是的,这是丑陋的)它返回false。 如果variables或数组元素不存在,只有isset()
和empty()
不会引发E_NOTICE。
is_null
和=== null
之间没有区别。 我认为===
更好,但是当你需要使用call_user_func
,你必须使用is_null
。
===
和is_null
是一样的。
根据这个评论 is_null
只有250ns慢。 我认为是因为一个函数比一个运算符慢。
PHP文档在is_null, === null, isset
上有很好的讨论和实验。 特别阅读评论部分。
我不能说,使用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