Есть ли разница между этим ...
if (is_null($var)) {
do_something();
}
и это?
if ($var === null) {
do_something();
}
Какая форма лучше проверяет, содержит ли переменная значение NULL? Есть ли какие-то крайние случаи, о которых мне следует знать? (Я инициализирую все свои переменные, поэтому несуществующие переменные не являются проблемой.)
===
оператор будет быстрее, так как это не явная функция ... но я был удивлен несколько раз.Ответы:
Если переменная инициализирована (что вы указали - хотя я не уверен на 100%, имеет ли это значение в данном контексте. Оба решения могут выдать предупреждение, если переменная не была определена), они функционально одинаковы. Я предполагаю,
===
что будет немного быстрее, так как это устраняет накладные расходы на вызов функции.Это действительно зависит от того, как вы смотрите на свое состояние.
===
предназначен для строгого сравнения данных. NULL имеет только одно «значение», поэтому это работает для сравнения с NULL (который является константой PHP нулевого «значения»)is_null
проверяет, что переменная имеет тип данных NULL.Выбор за вами на самом деле.
источник
is_null
вариант, потому что его легко случайно использовать== null
вместо=== null
. Поскольку== null
это то же самое, что иempty
(см. Другой ответ), это представляет больший потенциал для ошибки программиста (особенно младшего и среднего уровня), чем простая и читаемаяis_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
источник
$v
чтобы представить некоторую общую переменную, а затем остальныеisset($v)
,is_null($v)
,$v===null
и так далееisset
не будет жаловаться на неопределенную переменную, вернет false. Использованиеis_null
или=== null
приведет к появлению уведомления.Оба они точно такие же, я использую,
is_null
потому что это делает мой код более читабельным.источник
is_null
на самом деле это менее ясно. Несмотря на то, что он может хорошо читаться, не$v === null
оставляет сомнений в том, что сравнение выполняется со строгой семантикой, ноis_null($v)
некоторые программисты задаются вопросом, использует ли оно===
или==
семантику.is_null
можно полностью удалить или переопределить , тогда как=== null
всегда будет работать.Если для php кажется излишним иметь так много функций типа is_foo (), когда вы можете просто использовать стандартные операторы сравнения, подумайте о программно вызываемых функциях.
$arrayOfNullValues = array_filter($myArray, 'is_null');
источник
$arrayWithoutNullValues
тогда будет хранить массив, содержащий толькоnull
значения.Я только что провел быстрый тест, проверяя миллион итераций каждого.
is_null
для завершения потребовалось 8 секунд;=== null
взял 1.Так что звонок на
is_null
0.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;
источник
is_null()
на моем компьютере под 7.1.9 Win32 он работает немного быстрее.Я бы каждый раз использовал встроенную функцию PHP вместо сравнения операторов.
источник
is_null($var)
примерно в 14 раз медленнее, чем$var===null
... 37,8 мс против 2,6 мс.Но на самом деле я не знаю почему.
источник
Одна вещь, которую люди часто забывают упомянуть в этом обсуждении, заключается в том, что если вы все о строгой проверке типов,
is_null
это поможет вам никогда не допустить опечаток в ваших операторах сравнения (== vs ===).источник