php недійсний чи порожній?


208

У мене є питання щодо NULLPHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

Чому я бачу нульове значення, коли $aпорожній рядок? Це помилка?

Відповіді:


348

Що ви шукаєте:

if($variable === NULL) {...}

Зверніть увагу на ===.
При використанні ==, як ви робили, PHP трактує NULL , помилкове , 0 , в порожню рядок, і порожні масиви в якості рівних.


13
Неправдиво, ваш стан відповідає лише неініціалізованому та нульовому $variable. Те, що ви хочете, це насправді: $variable == null(зверніть увагу ==)
Thomas LAURENT

6
@ThomasLAURENT, саме це шукала ОП, вони цікавились, чому == nullвідповідає порожній рядок, а не просто недійсний чи невизначений.
Годвін

3
Oups моя помилка, але ваше останнє речення привело мене думати NULL, брехня, 0 і «» були строго рівні , які не так, вибачте за непорозуміння.
Thomas LAURENT

3
@James - це цілеспрямована поведінка в PHP, вона все ще є правдою навіть у 2017 році і, правда, буде триватий довгий час, я думаю
Defrag

1
$a = ''є порожнім string, falseбулевим, $a = 0;цілим і nullє від типу null. Що говорить ОП, це те, що PHP передасть їх як "однакові" за значенням, але не як "однакові" за типом. Тож сувора === перевірка також перевірятиме тип та помилку, якщо ви використовуєте різні. Ось чому ви повинні бути послідовними у повернених цінностях. Якщо ви нормально повертаєте рядок таким способом getName(), ви не повинні отримувати, nullколи він порожній, але, швидше за все, порожній рядок $user->getName() === '' або $user->getId() === 0або $user->isActive === false. Цільова поведінка!
Cagatay Ulubay

225

Як показано в наступній таблиці, empty($foo)він еквівалентний $foo==nullі is_null($foo)має ту саму функцію $foo===null. У таблиці також показані деякі хитрі значення щодо nullпорівняння. (eno позначає неініціалізовані змінні.)

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

Я ніколи не використовую empty()і is_null()функціоную. Використання простого порівняння менш неоднозначне, швидше і чіткіше. Особливо будуть менше фігурних дужок, щоб відповідати.

наприклад if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
У таблиці відсутні "0" та "0,0". Вони роблять речі справді складними, особливо порожніми (). Ось чому я уникаю використання порожнього ().
datasn.io

1
@PHPst База таблиці, яку ви показали, так що насправді є PHP-кодом того, що ви назвали "простим порівнянням"?
Chetabahana

@hyip ==nullі ===null.
PHPst

Це має бути головна відповідь, набагато повніша. Дякую.
пгр

@PHPst Ви сказали, що просте порівняння менш неоднозначне. Надайте, будь ласка, приклад використання простого порівняння замість цих NULL порожніх () тощо
Naeem Ul Wahhab

28

перевірити ==проти===

'' == NULLповернеться правдивим
0 == NULL, повернеться істинним
false == null, повернеться правдою

де як

'' === NULLповернеться хибним
0 === NULL, повернеться помилковим
false === NULL, повернеться хибним


Перевірено і правильно. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder

18

Ні, це не помилка. Подивіться на порівняння таблиці « =» з таблицею == (друга таблиця), яка показує результат порівняння кожного значення у першому стовпці зі значеннями в інших стовпцях:

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

Там ви можете бачити , що порожній рядок по ""порівнянні з false, 0, NULLабо ""дасть справжній.

Ви можете замість цього використати is_null [docs] або суворе порівняння (третя таблиця).


Таблиця Loose зіставлень, схоже, дозволяє припустити, що порівняння 0 == "php" або "php" == 0 приведе до обох результатів. Що там відбувається?
Роберт

1
@Robert: Рядок, що не починається з цифр, перетворюється на 0при передачі в рядок: codepad.org/qi40SG3E . Отже (int)"php" == 0.
Фелікс Клінг

@Robert: Я мав на увазі "коли передано число " .
Фелікс Клінг

12

Це не помилка, а нормальна поведінка PHP. Це відбувається тому, що ==оператор у PHP не перевіряє тип.

'' == null == 0 == false

Якщо ви також хочете перевірити, чи значення мають однаковий тип, використовуйте ===замість цього. Щоб глибоко вивчити цю різницю, будь ласка, прочитайте офіційну документацію .


8

Якщо ви використовуєте ==, php розглядає порожній рядок або масив як null. Щоб зробити відмінність між nullі empty, або використовуйте ===або is_null. Так:

if($a === NULL) або if(is_null($a))


if ($ a === NULL)
Caster


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