Почему (0 == 'Hello') возвращает true в PHP? - PullRequest
34 голосов
/ 05 мая 2011

Эй, если у вас есть следующий код и вы хотите проверить, совпадает ли $key с Hello Я обнаружил, что сравнение всегда возвращает true, если переменная 0.Я сталкивался с этим, когда массив для специального ключа и удивился, почему он не работает, как ожидалось.См. Этот код для примера.

$key = 1;
if ($key != 'Hello') echo 'Hello'; //echoes hello

$key = 2;
if ($key != 'Hello') echo 'Hello'; //echoes hello

$key = 0;
if ($key != 'Hello') echo '0Hello'; //doesnt echo hello. why?
if ($key !== 'Hello') echo 'Hello'; //echoes hello

Может кто-нибудь объяснить это?

Ответы [ 5 ]

49 голосов
/ 05 мая 2011

Операторы == и != не сравнивают тип. Поэтому PHP автоматически преобразует «Hello» в целое число, равное 0 (intval('Hello')). Если вы не уверены в типе, используйте операторы сравнения типов === и !==. Или лучше быть уверенным, какой тип вы используете в любой точке вашей программы.

3 голосов
/ 05 мая 2011

Другие уже хорошо ответили на вопрос. Я только хочу привести некоторые другие примеры, о которых вы должны знать, все они вызваны жонглированием типов в PHP. Все последующие сравнения вернут true :

  • 'abc' == 0
  • 0 == ноль
  • '' == null
  • 1 == '1y? Z'

Поскольку я считаю это поведение опасным, я написал собственный метод равных возможностей и использовал его в своих проектах:

/**
 * Checks if two values are equal. In contrast to the == operator,
 * the values are considered different, if:
 * - one value is null and the other not, or
 * - one value is an empty string and the other not
 * This helps avoid strange behavier with PHP's type juggling,
 * all these expressions would return true:
 * 'abc' == 0; 0 == null; '' == null; 1 == '1y?z';
 * @param mixed $value1
 * @param mixed $value2
 * @return boolean True if values are equal, otherwise false.
 */
function sto_equals($value1, $value2)
{
  // identical in value and type
  if ($value1 === $value2)
    $result = true;
  // one is null, the other not
  else if (is_null($value1) || is_null($value2))
    $result = false;
  // one is an empty string, the other not
  else if (($value1 === '') || ($value2 === ''))
    $result = false;
  // identical in value and different in type
  else
  {
    $result = ($value1 == $value2);
    // test for wrong implicit string conversion, when comparing a
    // string with a numeric type. only accept valid numeric strings.
    if ($result)
    {
      $isNumericType1 = is_int($value1) || is_float($value1);
      $isNumericType2 = is_int($value2) || is_float($value2);
      $isStringType1 = is_string($value1);
      $isStringType2 = is_string($value2);
      if ($isNumericType1 && $isStringType2)
        $result = is_numeric($value2);
      else if ($isNumericType2 && $isStringType1)
        $result = is_numeric($value1);
    }
  }
  return $result;
}

Надеюсь, это поможет кому-то сделать его приложение более убедительным, оригинальную статью можно найти здесь равно или не равно

1 голос
/ 05 мая 2011

Потому что PHP выполняет автоматическое приведение для сравнения значений разных типов. Вы можете увидеть таблицу критериев преобразования типов в документации PHP.

В вашем случае строка "Hello" автоматически преобразуется в число, равное 0 в соответствии с PHP. Отсюда и истинное значение.

Если вы хотите сравнить значения разных типов, вам следует использовать операторы с типобезопасностью:

$value1 === $value2;

или

$value1 !== $value2;

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

1 голос
/ 05 мая 2011

в значительной степени любое ненулевое значение преобразуется в true в php за кулисами.

так что 1, 2,3,4, 'Hello', 'world' и т. Д. Будут равны true, тогда как 0 равно false

единственная причина! == работает потому, что сравнивает типы данных тоже

0 голосов
/ 05 мая 2011

В php строка "0" преобразуется в логическое значение FALSE http://php.net/manual/en/language.types.boolean.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...