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

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

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

и это?

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

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

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

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

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

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

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

true

false

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

Резюме: 🔸 ♦ ️🔸

  • empty эквивалентно ==null
  • is_null эквивалентно ===null
  • isset инвертирован is_null и ===null

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

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

 $arrayOfNullValues = array_filter($myArray, 'is_null'); 

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

Таким образом, вызов is_null на is_null секунд медленнее, чем вызов === на моем компьютере.

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


Мой код:

 <?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; 

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

is_null($var) примерно в 14 раз медленнее, чем $var===null … 37.8 ms против 2.6 ms.

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