Возможный дубликат:
В чем разница между is_null ($ var) и ($ var === null)?
PHP имеет два (которые я знаю и три, если вы подсчитаете методы isset()
), чтобы определить, имеет ли значение значение null: is_null()
и === null
. Я слышал, но не подтвердил, что === null
быстрее, но в обзоре кода кто-то настоятельно предложил использовать is_null()
поскольку он специально разработан для цели нулевой оценки. Он также начал говорить о математике или что-то в этом роде.
Во всяком случае, факт, что is_null()
по-видимому, медленнее, также заставляет меня думать, что он делает больше, чем === null
, и, вероятно, предпочтителен. Есть ли причина использовать тот или иной? Всегда ли это предпочтительнее? Что относительно isset()
?
Как дополнение, возможно, не закрывает этот вопрос, а что насчет isset()
vs. is_null()
? Кажется, что все isset()
будет делать это, чтобы подавить уведомление, поэтому, если вы действительно не хотите is_null()
уведомление о неопределенной переменной, то зачем использовать is_null()
? Как насчет того, знаете ли вы, что переменная инициализируется в то время?
Наконец, есть ли какая-либо математическая причина предпочесть is_null()
над === null
? Что-то вроде null не сравнимо?
Нет никакой разницы в функциональности между is_null
и === null
.
Единственное различие заключается в том, что is_null
является функцией и, следовательно,
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
( это на самом деле довольно распространено, потому что люди используют array_key_exists
в offsetExists
/ __isset
).
Как указано другими, существует разница во времени между использованием ===
и 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
См. Код в действии
Все они имеют свои места, хотя только 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()
если переменная, возможно, не определена. Он возвращает false, когда переменная не определена или === null
(да, это так уродливо). Только isset()
и empty()
не создают E_NOTICE, если элемент переменной или массива не существует.
На самом деле разница между is_null
и === null
is_null
. Я думаю, что ===
намного приятнее, но когда вам, например, нужно использовать call_user_func
по какой-то сомнительной причине, вам придется использовать is_null
.
===
и is_null
– то же самое.
Согласно этому комментарию is_null
только на 250ns медленнее. Я думаю, потому что функция медленнее, чем оператор.
В документации PHP есть хорошее обсуждение и эксперименты на is_null, === null, isset
. Особенно прочитайте раздел комментария.
Я не могу сказать, что лучше использовать is_null
или === null
. Но имейте в isset
при использовании 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