PHP нулевой или пустой?

208

У меня есть вопрос относительно NULLPHP:

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

Почему я вижу ноль, когда $aпустая строка? Это ошибка?

Эрин Такер
источник

Ответы:

348

То, что вы ищете, это:

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

Обратите внимание ===.
При использовании ==, как и вы, PHP обрабатывает NULL , false , 0 , пустую строку и пустые массивы как равные.

Годвин
источник
13
Неверно, ваше условие соответствует только неинициализированным и нулевым $variable. То, что вы хотите на самом деле: $variable == null(обратите внимание ==)
Томас ЛОРЕНТ
6
@ThomasLAURENT, это то, что ищет OP, они задавались вопросом, почему == nullсопоставляется пустая строка, а не просто ноль или неопределенное значение.
Годвин
3
Да, моя ошибка, но ваше последнее предложение заставило меня думать, что NULL, false, 0 и "" были строго равны, что неправильно, извините за недоразумение.
Томас ЛОРЕНТ
3
@James - это предполагаемое поведение в PHP, оно по-прежнему верно даже в 2017 году и, вероятно, будет долгое время долгое время
Defrag
1
$a = ''является пустым string, falseявляется логическим, $a = 0;является целым числом и nullот типа null. OP говорит о том, что PHP будет обрабатывать их как «одинаковые» по значению, но не как «одинаковые» по типу. Поэтому строгая === проверка также проверит тип и потерпит неудачу, если вы используете разные. Вот почему вы должны быть последовательны в ваших возвращаемых значениях. Если вы обычно возвращаете строку в таком методе, как getName(), вы не должны получать, nullкогда она пустая, но, скорее, строку emtpy $user->getName() === ''или $user->getId() === 0или $user->isActive === false. Намеренное поведение!
Cagatay Ulubay
225

Как показано в следующей таблице, empty($foo)эквивалентно $foo==nullи is_null($foo)имеет ту же функцию $foo===null. В таблице также приведены некоторые хитрые значения, касающиеся nullсравнения. (ϕ обозначает неинициализированные переменные.)

         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)противif(is_null($x) || is_null($y))

PHPst
источник
2
Отсутствуют «0» и «0.0» в таблице. Они делают вещи действительно хитрыми, особенно пустыми (). Вот почему я избегаю использования empty ().
datasn.io
1
@PHPst Основываясь на таблице, которую вы показали, так что же на самом деле представляет собой php-код того, что вы назвали «простым сравнением»?
Четабахана,
@hyip ==nullи ===null.
PHPst
Это должен быть главный ответ, гораздо более полный. Спасибо.
РРР
@PHPst Вы сказали, что простое сравнение менее неоднозначно. Можете ли вы привести пример использования простого сравнения вместо NULL empty () и т. Д.
Наим Уль Ваххаб
28

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

'' == NULLвернул
0 == NULLбы true
false == nullвернул бы true вернул бы true

в то время как

'' === NULLвернул
0 === NULLбы ложь
false === NULLвозвратил бы ложь возвратил бы ложь

jancha
источник
Проверено и правильно. '' == null (true), а '' === null (false)
TheLegendaryCopyCoder
18

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

    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 [документы] или строгое сравнение (третья таблица).

Феликс Клинг
источник
Похоже, что в таблице свободных сравнений сравнение 0 == "php" или "php" == 0 даст оба значения true. То, что там происходит?
Роберт
1
@ Роберт: строка, не начинающаяся с цифр, преобразуется 0при преобразовании в строку: codepad.org/qi40SG3E . Так (int)"php" == 0.
Феликс Клинг
@ Роберт: Я имел в виду «когда приведен к числу » .
Феликс Клинг
12

Это не ошибка, а нормальное поведение PHP. Это происходит потому, что ==оператор в PHP не проверяет тип.

'' == null == 0 == false

Если вы также хотите проверить, имеют ли значения одинаковый тип, используйте ===вместо этого. Чтобы глубоко изучить эту разницу, пожалуйста, прочитайте официальную документацию .

Аурелио Де Роса
источник
8

Если вы используете ==, PHP обрабатывает пустую строку или массив как null. Чтобы провести различие между nullи empty, используйте ===или is_null. Так:

if($a === NULL) или if(is_null($a))

dayuloli
источник
if ($ a === NULL)
Кастер
6

PHP 7 isset () против пустых () против is_null ()

введите описание изображения здесь

Фуед МУССИ
источник