Оператори порівняння
Оператори порівняння, як це видно з їхньої назви, дозволяють порівнювати між собою два значення. Можуть також виявитися цікавими для знайомства таблиці порівняння типів, оскільки в них показані приклади порівнянь, пов'язаних із різними типами.
Оператори порівняння
Приклад | Название | Результат |
---|---|---|
$a == $b | Рівно | Повертається true , якщо значення змінної $a після перетворення типів дорівнює значенням змінної $b. |
$a === $b | Тотожно | Повертається **true **якщо значення змінної $a дорівнює значенню змінної $b і має той самий тип. |
$a != $b | Не дорівнює | Повертається true , якщо значення змінної $a після перетворення типів не дорівнює значенню змінної $b. |
$a <> $b | Не дорівнює | Повертається true , якщо значення змінної $a після перетворення типів не дорівнює значенню змінної $b. |
$a !== $b | Тотожно не одно | Повертається **true **якщо значення змінної $a не дорівнює значенню змінної $b або вони різних типів. |
$a < $b | Менше | Повертається **true **якщо значення змінної $a строго менше значення змінної $b. |
$a > $b | Більше | Повертається **true **якщо значення змінної $a строго більше значення змінної $b. |
$a <= $b | Менше або дорівнює | Повертається **true **якщо значення змінної $a менше або дорівнює значенням змінної $b. |
$a >= $b | Більше або дорівнює | Повертається **true **якщо значення змінної $a більше або дорівнює значенням змінної $b. |
$a <=> $b | Космічний корабель (spaceship) | Ціле число (int) менше, більше або дорівнює нулю, коли значення змінної $a менше, більше або дорівнює значенню змінної $b. |
Если оба операнда —рядки, що містять числа, або один операнд - число, а інший - рядок, що містить числа, то порівняння виконується чисельно. Ці правила також справедливі для оператора switch. Тип не перетворюється при порівняннях виду ===
или!==
оскільки це включає порівняння типу, а також значення.
Увага
До PHP 8.0.0, якщо рядок (string) порівнювався з числом або рядком, що містить число, то рядок (string) перетворювався на число перед виконанням порівняння. Це могло призвести до несподіваних результатів, які можна побачити на наступному прикладі:
Loading...
Результат виконання наведеного прикладу в PHP 7:
bool(true)
bool(true)
bool(true)
bool(true)
0
Результат виконання наведеного прикладу в PHP 8:
bool(false)
bool(true)
bool(true)
bool(true)
a
Loading...
Для різних типів порівняння відбувається відповідно до наступної таблиці (по порядку).
Порівняння типів
Тип операнда 1 | Тип операнда 2 | Результат |
---|---|---|
null або string | string | null перетворюється на порожній рядок (""), числове чи лексичне порівняння |
bool або null | що завгодно | Перетворюється на bool, false < true |
object | object | Вбудовані класи можуть визначати свої правила порівняння, об'єкти різних класів не порівнюються, порівняння об'єктів одного класу розказано в розділі «Порівняння об'єкта» |
string, resource, int або float | string, resource, int або float | Рядки та ресурси переводяться в числа, звичайна математика |
array | array | Масив з меншим числом елементів менший, якщо ключ з першого масиву не знайдено у другому масиві — масиви не можуть порівнюватися, інакше йде порівняння значень (див. приклад нижче) |
array | що завгодно | Тип array завжди більший |
object | що завгодно | Тип object завжди більший |
Приклад #1 Порівняння boolean/null
Loading...
Приклад #2 Алгоритм порівняння звичайних масивів
Loading...
Увага
Порівняння чисел з плаваючою точкою
З причин, пов'язаних зі способом внутрішнього представлення чисел з плаваючою точкою (float), не потрібно перевіряти два числа з плаваючою точкою (float) на рівність.
Докладніше про це можна дізнатися в документації типу float.
Зауваження: Коли пишуть код, пам'ятають, що жонглювання типами PHP не завжди дає передбачуваний результат при порівнянні значень різних типів, особливо при порівнянні цілих чисел (int) з логічними значеннями (bool) або цілих чисел (int) з рядками (string). Тому краще користуватись операторами
===
и!==
, а не==
и!=
Незрівнянне значення
Хоча тотожні порівняння (===
и!==
) можна застосовувати до довільних значень, інші оператори порівняння краще застосовувати лише до порівнянних значень. Результат порівняння незрівнянних значень не визначено і не потрібно покладатися.
Дивіться також
Тернарний оператор
Ще один умовний оператор – тернарний оператор «?:».
Приклад #3 Призначення за промовчанням
Loading...
Вираз (expr1) ? (expr2) : (expr3)
інтерпретується як expr2, якщо expr1 дорівнює true
, або як expr3, якщо expr1 дорівнює false
Можна не писати середню частину тернарного оператора. Вираз expr1 ?: expr3
оцінюється як результат виразу expr1, якщо воно оцінюється як true
, інакше як результат виразу expr3. Вираз expr1 оцінюється лише один раз.
Зауваження: Зверніть увагу, що тернарний оператор - це вираз, і він оцінюється не як змінна, а як результат виразу Це важливо, якщо потрібно повернути змінну за посиланням. Вираз
return $var == 42 ? $a : $b;
не працюватиме у функції, що повертає значення за посиланням, а в пізніших версіях PHP також буде видано попередження.
Зауваження :
Рекомендовано уникати «нагромадження» тернарних виразів. Поведінка PHP при вказівці більш ніж одного тернарного оператора без дужок в одному виразі не очевидна порівняно з іншими мовами. Справді, до PHP 8.0.0 троїчні висловлювання оцінювалися як лівоасоціативні, а чи не правоасоціативні, як у більшості інших мов програмування. Опора на ліву асоціативність застаріла з PHP 7.4.0. Починаючи з PHP 8.0.0, тернарний оператор неасоціативний.
Приклад #4 Неочевидна поведінка тернарного оператора
Loading...
Зауваження :
Ланцюжок коротких тернарних операторів (
?:
), однак, стабільна і поводиться обґрунтовано. Вона оцінюватиме перший аргумент, який оцінюється як помилкове значення. Зверніть увагу, що невизначені значення однаково викликатимуть попередження.Приклад #5 Ланцюжок коротких тернарних операторів
Loading...
Оператор об'єднання з null
Інший корисний скорочений оператор – це оператор об'єднання з NULL – «??» (Null coalescing).
Приклад #6 Призначення за промовчанням
Loading...
Вираз (expr1) ?? (expr2)
обчислюється так: expr2, якщо expr1 дорівнює **null
**інакше expr1.
Цей оператор не викликає попередження або помилки, якщо лівий операнд не існує, як мовна конструкція isset(). Це дуже корисно для ключів масиву.
Зауваження: Зверніть увагу, оператор об'єднання з NULL - це вираз, і він оцінюється не як змінна, а як результат обчислення виразу. Це важливо, якщо потрібно повернути значення за посиланням. Вираз
return $foo ?? $bar;
у функції, що повертає посилання, не працюватиме, а виводитиме попередження.
Зауваження :
Оператор об'єднання з NULL має низький пріоритет. Тобто при змішуванні його з іншими операторами (наприклад, з операторами конкатенації рядків або арифметичними операторами), швидше за все, будуть потрібні круглі дужки.
Loading...
Зауваження :
Зверніть увагу, оператор об'єднання з NULL дозволяє просту вкладеність:
Приклад #7 Вкладений оператор null coalescing
Loading...