Is_null ($ x) vs $x === null в PHP

Возможный дубликат:
В чем разница между 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