Какая разница между is_null ($ var) и ($ var === null)?

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

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

и это?

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

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

Ответ 1

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

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

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

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

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

Ответ 2

true

false

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

Резюме: 🔸 ♦ ️🔸

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Я только что запустил быстрый тест, проверив миллион итераций каждого из них. 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;

Ответ 6

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

Ответ 7

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

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

Ответ 8

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