Проверка на 0 в разных версиях PHP

Проверка на 0 может давать непредсказуемые результаты! 

Таблица, какие вот результаты бывают у абсолютно одинаковых условий на разных версиях PHP.

# if            PHP 7.3   PHP 8.3
(0 == 'A')      true      false     ! отличается !
(0 === 'A')     false     false
(0 != 'A')      false     true      ! отличается !
(0 !== 'A')     true      true
(0)             false     false
(! 0)           true      true

('0' == 'A')    false     false
('0' === 'A')   false     false
('0' != 'A')    true      true
('0' !== 'A')   true      true
('0')           false     false
(! '0')         true      true

Например, если делаем intval() входящей переменной $_POST['id'] (любой конечно переменной), мы ее из строки превращаем в int и сравнение на 0, если это не строка, выдает неоднозначные результаты. Они разные в разных версиях PHP, но в данном случае именно PHP 8.3 обрабатывает условия корректно, но полагаться на это не стоит, в будущем такое поведение PHP может не сохраниться.

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

Тестовый код, результаты которого выложены выше

Выполните этот код на разных версиях PHP и сравните результаты.

<?php
// Упрощенный вариант, без стилей и лишних тегов.
echo "<div><pre>";
$var = 0;

if ($var == "A") {
  echo '(0 == \'A\') ' . "     true<br>";
} else {
  echo '(0 == \'A\') ' . "     false<br>";
}

if ($var === "A") {
  echo '(0 === \'A\') ' . "    true<br>";
} else {
  echo '(0 === \'A\') ' . "    false<br>";
}

if ($var != "A") {
  echo '(0 != \'A\') ' . "     true<br>";
} else {
  echo '(0 != \'A\') ' . "     false<br>";
}

if ($var !== "A") {
  echo '(0 !== \'A\') ' . "    true<br>";
} else {
  echo '(0 !== \'A\') ' . "    false<br>";
}

if ($var) {
  echo '(0) ' . "            true<br>";
} else {
  echo '(0) ' . "            false<br>";
}

if (! $var) {
  echo '(! 0) ' . "          true<br>";
} else {
  echo '(! 0) ' . "          false<br>";
}
echo "<br>";

$var = '0';

if ($var == "A") {
  echo '(\'0\' == \'A\') ' . "   true<br>";
} else {
  echo '(\'0\' == \'A\') ' . "   false<br>";
}

if ($var === "A") {
  echo '(\'0\' === \'A\') ' . "  true<br>";
} else {
  echo '(\'0\' === \'A\') ' . "  false<br>";
}

if ($var != "A") {
  echo '(\'0\' != \'A\') ' . "   true<br>";
} else {
  echo '(\'0\' != \'A\') ' . "   false<br>";
}

if ($var !== "A") {
  echo '(\'0\' !== \'A\') ' . "  true<br>";
} else {
  echo '(\'0\' !== \'A\') ' . "  false<br>";
}

if ($var) {
  echo '(\'0\') ' . "          true<br>";
} else {
  echo '(\'0\') ' . "          false<br>";
}

if (! $var) {
  echo '(! \'0\') ' . "        true<br>";
} else {
  echo '(! \'0\') ' . "        false<br>";
}
echo "</pre></div>";
?>

 

 

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *