Яка різниця між is_null ($ var) і ($ var === null)?


83

Чи є якась різниця між цим ...

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

і це?

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

Яка форма найкраща при перевірці, чи містить змінна значення null? Чи є якісь крайні випадки, про які я повинен знати? (Я ініціалізую всі свої змінні, тому неіснуючі змінні не є проблемою.)


5
Можна подумати, що ===оператор буде швидшим, оскільки це не явна функція ... але я був здивований раз-два.
Джон Джотта,

Відповіді:


30

За умови ініціалізації змінної (що ви вказали - хоча я не впевнений на 100%, чи це важливо у цьому контексті чи ні. Обидва рішення можуть видавати попередження, якщо змінна не була визначена), вони функціонально однакові. Я припускаю, що ===це буде незначно швидше, хоча, оскільки це видаляє накладні витрати на виклик функції.

Це насправді залежить від того, як ви ставитеся до свого стану.

===для суворого порівняння даних. NULL має лише одне "значення", тому це працює для порівняння з NULL (що є константою PHP нульового "значення")

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

Насправді все залежить від вас.


2
Дякуємо за пояснення порівняння за значенням проти порівняння за типом.
kijin

4
Я віддаю перевагу is_nullваріанту, оскільки його легко випадково використовувати, == nullа не === null. Оскільки == nullце те саме, що empty(див. Іншу відповідь), це створює більший потенціал для помилок програміста (особливо молодшого та середнього рівня), ніж проста та читабельна is_null.
райман

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

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

17

Обидва вони абсолютно однакові, я використовую їх, is_nullоскільки це робить мій код більш читабельним


3
і хоча === спочатку може бути швидшим, PHP-оптимізатор повинен це виправити.
foo

10
Я відчуваю is_nullнасправді менш зрозуміло. Хоча це може прочитати красиво, $v === nullне залишає сумнівів в тому , що порівняння робиться з суворою семантикою, але is_null($v)деякі кодери буде цікаво , якщо він використовує ===або ==семантикою.
козел

4
@goat, ish1301, Крім того, is_nullможе бути видалений або перевизначений повністю, тоді як === nullзавжди буде працювати.
Pacerier

@Pacerier, хоча ваш приклад цікавий, ймовірність того, що хтось встановить пакет runkit pecl, а потім налаштує його, щоб дозволити видалення вбудованих функцій, а потім видалити is_null, з усіх речей, не замінюючи його чимось, дуже близька до нуля або нуль, якщо Ви віддаєте перевагу. Єдиний сценарій, який я можу придумати, де людина хотіла б видалити is_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) при 10000 операціях. Тест пройшов 30 разів, і ці цифри є середніми.
Джастін Е


0

is_null($var)приблизно в 14 разів повільніше, ніж $var===null... 37,8 мс проти 2,6 мс.

Але насправді я не знаю чому.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.