Оператори порівняння

Оператори порівняння, як це видно з їхньої назви, дозволяють порівнювати між собою два значення. Можуть також виявитися цікавими для знайомства таблиці порівняння типів, оскільки в них показані приклади порівнянь, пов'язаних із різними типами.

Оператори порівняння

ПрикладНазваниеРезультат
$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 або stringstringnull перетворюється на порожній рядок (""), числове чи лексичне порівняння
bool або nullщо завгодноПеретворюється на bool, false < true
objectobjectВбудовані класи можуть визначати свої правила порівняння, об'єкти різних класів не порівнюються, порівняння об'єктів одного класу розказано в розділі «Порівняння об'єкта»
string, resource, int або floatstring, resource, int або floatРядки та ресурси переводяться в числа, звичайна математика
arrayarrayМасив з меншим числом елементів менший, якщо ключ з першого масиву не знайдено у другому масиві — масиви не можуть порівнюватися, інакше йде порівняння значень (див. приклад нижче)
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...