PHP пустой var == 0? - PullRequest
       29

PHP пустой var == 0?

5 голосов
/ 17 марта 2012

В php 5

  $my_var = "";

  if ($my_var == 0) {
    echo "my_var equals 0";

  }

Почему он оценивает истину? Есть ли какая-то ссылка на php.net по этому поводу?

Ответы [ 5 ]

3 голосов
/ 17 марта 2012

Строка и целое число не сопоставимы напрямую с ==. Так что PHP выполняет жонглирование типов, чтобы увидеть, есть ли другое разумное сравнение.

Когда строка сравнивается с целым числом, строка сначала конвертируется в целое число. Вы можете найти детали преобразования здесь . По сути, поскольку "" не является допустимым числом, результатом преобразования будет 0. Таким образом, сравнение становится 0 == 0, что явно верно.

Возможно, вы захотите использовать сравнение идентификаторов === для большинства (если не всех) ваших сравнений.

3 голосов
/ 17 марта 2012

PHP - это слабо типизированный язык .Пустые строки и логическое значение false будут иметь значение 0 при тестировании с оператором равенства ==.С другой стороны, вы можете заставить его проверять тип с помощью идентичного оператора === как такового:

$my_var = "";

if ($my_var === 0) {
   echo "my_var equals 0";
} else {
   echo "my_var does not equal 0";
}

Это должно дать вам тонну информации по теме: Как сделатьоператоры сравнения равенства (== double equals) и тождества (=== triple equals) в PHP различаются?

1 голос
/ 17 марта 2012

Это происходит из-за приведения типов, которое исходит от используемого вами оператора равенства.

В руководстве PHP есть таблицы сравнения типов, чтобы пролить свет на это.

Обычно считается хорошей практикой использовать идентичный оператор ===, чтобы избежать таких угловых (?) Случаев.

1 голос
/ 17 марта 2012

В первой строке вы определяете $my_var как строку.

Внутри сравнения вы сравниваете эту переменную с постоянным целым числом.

Если вы хотите точное сравнение (я незнаете, почему вам нужно сравнить строку с целым числом без приведения), вы должны использовать ===:

if ($my_var === 0) {
  echo "my_var equals 0";
}

, который никогда не будет отображать сообщение.

Руководство по PHP определяетв разделе Операторы сравнения , оператор == имеет вид:

TRUE, если $ a равно $ b после жонглирования типа.

Итакважная вещь здесь type juggling.

На самом деле, в PHP Manual: сравнения типов , вторая таблица сообщает вам именно это целое число 0 равно строке "".

0 голосов
/ 17 марта 2012

вот ссылка в руководстве по php о логических значениях

http://www.php.net/manual/en/language.types.boolean.php

, а вот ссылка на значение NULL

http://www.php.net/manual/en/language.types.null.php

$my_var = '';

if ($my_var == 0) {
    echo "my_var equals 0"
}

оценивается как истинноепотому что "" такой же, как NULL, который оценивается как ложный или 0

...