В чем разница между is_null ($ var) и ($ var === null)?

84

Есть ли разница между этим ...

if (is_null($var)) {
    do_something();
}

и это?

if ($var === null) {
    do_something();
}

Какая форма лучше проверяет, содержит ли переменная значение NULL? Есть ли какие-то крайние случаи, о которых мне следует знать? (Я инициализирую все свои переменные, поэтому несуществующие переменные не являются проблемой.)

Киджин
источник
6
Вы могли подумать, что ===оператор будет быстрее, так как это не явная функция ... но я был удивлен несколько раз.
Джон Джотта

Ответы:

31

Если переменная инициализирована (что вы указали - хотя я не уверен на 100%, имеет ли это значение в данном контексте. Оба решения могут выдать предупреждение, если переменная не была определена), они функционально одинаковы. Я предполагаю, ===что будет немного быстрее, так как это устраняет накладные расходы на вызов функции.

Это действительно зависит от того, как вы смотрите на свое состояние.

===предназначен для строгого сравнения данных. NULL имеет только одно «значение», поэтому это работает для сравнения с NULL (который является константой PHP нулевого «значения»)

is_null проверяет, что переменная имеет тип данных NULL.

Выбор за вами на самом деле.

Craige
источник
2
Благодарим за объяснение сравнения по значению и по типу.
kijin
5
Я предпочитаю is_nullвариант, потому что его легко случайно использовать == nullвместо === null. Поскольку == nullэто то же самое, что и empty(см. Другой ответ), это представляет больший потенциал для ошибки программиста (особенно младшего и среднего уровня), чем простая и читаемая is_null.
ryanm
101

является true

является false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|  true |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| false |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     0 |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     1 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
|    \0 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| unset |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|   ""  |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |

Резюме: 🔸 ♦ ️🔸

  • empty эквивалентно ==null
  • is_null эквивалентно ===null
  • issetинверсия is_nullи===null
PHPst
источник
12
Мне очень нравится этот стол.
Cheok Yan Cheng
3
это может сделать стол немного более ясно , чтобы первый столбец с именем , $vчтобы представить некоторую общую переменную, а затем остальные isset($v), is_null($v), $v===nullи так далее
Брандина
@Brandin Спасибо за предложение. Не стесняйтесь редактировать ответ.
PHPst
4
@Pacerier Он четко сказал, что они эквивалентны, поэтому функциональной разницы нет.
PHPst
1
issetне будет жаловаться на неопределенную переменную, вернет false. Использование is_nullили === nullприведет к появлению уведомления.
user1431317 08
17

Оба они точно такие же, я использую, is_nullпотому что это делает мой код более читабельным.

Иш
источник
3
и хотя сначала === может быть быстрее, оптимизатор PHP должен это исправить.
foo
10
Мне кажется, is_nullна самом деле это менее ясно. Несмотря на то, что он может хорошо читаться, не $v === nullоставляет сомнений в том, что сравнение выполняется со строгой семантикой, но is_null($v)некоторые программисты задаются вопросом, использует ли оно ===или ==семантику.
goat
4
@goat, ish1301, также is_nullможно полностью удалить или переопределить , тогда как === nullвсегда будет работать.
Pacerier 09
@Pacerier, в то время как ваш пример интересен, вероятность того, что кто-то установит пакет runkit pecl, а затем настроит его, чтобы разрешить удаление встроенных функций, а затем удалить is_null, из всех вещей, без замены его чем-то, очень близка к nil или null, если Вы предпочитаете. Единственный сценарий, который я могу придумать, когда человек захочет удалить is_null, - это если он захочет изменить поведение сравнения null глобально. Например; возвращает false вместо true для unset; В этом случае это было бы возможно только в том случае, если бы код изначально был написан с is_null.
kaan_a
7

Если для php кажется излишним иметь так много функций типа is_foo (), когда вы можете просто использовать стандартные операторы сравнения, подумайте о программно вызываемых функциях.

$arrayOfNullValues = array_filter($myArray, 'is_null');
козел
источник
$arrayWithoutNullValuesтогда будет хранить массив, содержащий только null значения.
PointedEars,
5

Я только что провел быстрый тест, проверяя миллион итераций каждого. is_nullдля завершения потребовалось 8 секунд; === nullвзял 1.

Так что звонок на is_null0.000007с медленнее, чем звонок ===на моем компьютере.

Я бы нашел что-нибудь более полезное для оптимизации.


Мой код:

<?php

$start = time();
$var = null;

for ($i = 1000000; $i--; ) {
    is_null($var);
}

echo time() - $start;

$start = time();

for ($i = 1000000; $i--; ) {
    $var === null;
}

echo time() - $start;
одинокий день
источник
1
Интересно, что PHP / 7, похоже, решил эту проблему, и теперь производительность практически идентична; на самом деле, is_null()на моем компьютере под 7.1.9 Win32 он работает немного быстрее.
Альваро Гонсалес
@ ÁlvaroGonzález Я заметил то же самое. Разница между двумя функциями незначительна. (is_null: 0,54486592610677, === null: 0,7440135592506) при 10 000 операций. Тест проводился 30 раз, и это средние числа.
Justin E
1

Я бы каждый раз использовал встроенную функцию PHP вместо сравнения операторов.

Майкл Иригойен
источник
0

is_null($var) примерно в 14 раз медленнее, чем $var===null ... 37,8 мс против 2,6 мс.

Но на самом деле я не знаю почему.

Floern
источник
0

Одна вещь, которую люди часто забывают упомянуть в этом обсуждении, заключается в том, что если вы все о строгой проверке типов, is_nullэто поможет вам никогда не допустить опечаток в ваших операторах сравнения (== vs ===).

Ожье Шелвис
источник