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() будет делать это, чтобы подавить уведомление, поэтому, если вы действительно не хотите is_null() уведомление о неопределенной переменной, то зачем использовать is_null() ? Как насчет того, знаете ли вы, что переменная инициализируется в то время?

Наконец, есть ли какая-либо математическая причина предпочесть is_null() над === null ? Что-то вроде null не сравнимо?

Нет никакой разницы в функциональности между 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() иногда может возвращать 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