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