== проверяет, равны ли два значения после того, как 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 <=> $b | Spaceship | возвращает -1, 0 или 1 |
Таблица нестрогого и строгого сравнения
Каждую ячейку этой таблицы вычислил PHP 8.3. Переключайтесь между == и === и нажимайте на ячейку, чтобы увидеть выражение. Сетка == полна сюрпризов в строках для null, "", "0" и []; сетка === это просто её диагональ.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Как == сравнивает разные типы
Правила, которым следует PHP 8, в порядке их важности на практике:
- Две числовые строки сравниваются как числа:
"10" == "1e1"и"1" == "01"обаtrue. - Число и числовая строка: строка становится числом.
100 == "1e2"равноtrue. - Число и нечисловая строка: начиная с PHP 8, число становится строкой, и они сравниваются как строки.
0 == "a"равноfalse(в PHP 7 былоtrue). - Что угодно и bool: обе стороны приводятся к bool.
"a" == trueи[] == falseравныtrue. - null и строка:
nullстановится"", поэтомуnull == ""равноtrue, аnull == "0"равноfalse. С любым другим типомnullсравнивается какfalse. - Два массива: равны, когда у них одинаковые пары ключ/значение.
Последняя строка показывает, почему сравнение порядка с 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, или округляйте оба числа до нужной точности.