Menu

Операторы сравнения PHP: == и ===, а также <=>

PHP сравнивает значения через == (равны после приведения типов), === (равны значение и тип), != и !==, < > <= >= и оператор spaceship <=>. Когда == приводит типы, что изменилось в PHP 8, и все нестрогие и строгие сравнения в одной таблице.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

== проверяет, равны ли два значения после того, как PHP приведёт их к общему типу. === проверяет, что они равны и одного типа. Поэтому 1 == "1" равно true, а 1 === "1" равно false.

Большинство ошибок со сравнениями возникает, когда == приводит что-то неожиданное. Хороший вариант по умолчанию это === и !==, а == стоит использовать, только когда приведение действительно нужно.

Все операторы сравнения PHP

ОператорНазваниеИстинно, когда
$a == $bРавноравны после приведения типов
$a === $bТождественно равноравны и одного типа
$a != $b, $a <> $bНе равноне равны после приведения типов
$a !== $bТождественно не равноне равны или разных типов
$a < $b, $a > $bМеньше, больше
$a <= $b, $a >= $bМеньше или равно, больше или равно
$a <=> $bSpaceshipвозвращает -1, 0 или 1

Таблица нестрогого и строгого сравнения

Каждую ячейку этой таблицы вычислил PHP 8.3. Переключайтесь между == и === и нажимайте на ячейку, чтобы увидеть выражение. Сетка == полна сюрпризов в строках для null, "", "0" и []; сетка === это просто её диагональ.

Нестрогое (==) и строгое (===) сравнение
Point at or tap a cell to read it as PHP.
$a == $btruefalse10-1"1""0"""null[]"php""10""1e1"
true
false
1
0
-1
"1"
"0"
""
null
[]
"php"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Как == сравнивает разные типы

Правила, которым следует PHP 8, в порядке их важности на практике:

  1. Две числовые строки сравниваются как числа: "10" == "1e1" и "1" == "01" оба true.
  2. Число и числовая строка: строка становится числом. 100 == "1e2" равно true.
  3. Число и нечисловая строка: начиная с PHP 8, число становится строкой, и они сравниваются как строки. 0 == "a" равно false (в PHP 7 было true).
  4. Что угодно и bool: обе стороны приводятся к bool. "a" == true и [] == false равны true.
  5. null и строка: null становится "", поэтому null == "" равно true, а null == "0" равно false. С любым другим типом null сравнивается как false.
  6. Два массива: равны, когда у них одинаковые пары ключ/значение.

Последняя строка показывает, почему сравнение порядка с null редко имеет смысл: null становится false, -1 становится true, а false < true.

Не равно: != и !==

!= и <> это один и тот же оператор. !== его строгая версия. Разница важнее всего с функциями, которые возвращают 0 или false, например strpos:

0 != false равно false, потому что 0 приводится к false. 0 !== false равно true, потому что int это не bool. Та же ловушка у array_search и у in_array без флага строгости.

Сравнение строк

< и > сравнивают строки побайтно (для обычного ASCII это алфавитный порядок). Если обе строки числовые, они сравниваются как числа. Для сравнения без учёта регистра или в "естественном" порядке используйте функции:

Оператор spaceship <=>

$a <=> $b возвращает -1, когда $a меньше, 0, когда они равны, и 1, когда $a больше. Он использует те же правила, что < и ==, и это самый короткий способ написать колбэк сортировки.

Сравнение двух массивов через <=> идёт поэлементно, и так колбэк сортирует сначала по возрасту, а потом по имени. Больше рецептов сортировки на странице о сортировке массивов.

Частая ошибка: сравнение float через ==

Float хранятся в двоичном виде, поэтому многие десятичные значения приближённые. 0.1 + 0.2 не равно в точности 0.3, и == видит разницу.

Деньги храните в целых копейках или центах и сравнивайте их через ===.

Часто задаваемые вопросы

Чем == отличается от === в PHP?

== приводит обе стороны к общему типу и потом сравнивает, поэтому 1 == "1" равно true. === истинно, только когда значения равны и одного типа, поэтому 1 === "1" равно false. Используйте ===, если приведение вам не нужно.

Равно ли 0 == "a" true в PHP?

Начиная с PHP 8 нет. Когда число сравнивается с нечисловой строкой, PHP 8 сравнивает их как строки, поэтому 0 == "a" равно false. В PHP 7 строка приводилась к 0, и результат был true.

Чем != отличается от !== в PHP?

!= (и его синоним <>) противоположен ==: он ложен, когда значения равны после приведения типов. !== противоположен ===: он истинен, когда различаются значения или их типы, поэтому 0 !== false равно true, а 0 != false равно false.

Как сравнить два float в PHP?

Не используйте == для результатов арифметики с float: 0.1 + 0.2 == 0.3 равно false. Вместо этого сравнивайте разницу с небольшим допуском: abs($a - $b) < PHP_FLOAT_EPSILON, или округляйте оба числа до нужной точности.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ