Есть ли разница между этим …
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.
Но на самом деле я не знаю почему.