Тернарний оператор дозволяє скоротити просту умову в один рядок в тому місці, де синтаксичний розбір непотрібний, складний або відверто недоречний.
Тернарні оператори є скороченням для умов "якщо" та "інакше", тому їх можна не використовувати. Вони корисні для постійно повторюваних фрагментів логіки перевірки. Завжди використовуйте формат (умова ? позитивна логіка : негативна логіка)
, включаючи круглі дужки. Використовуйте для короткої перевірки, щоб зробити код більш зрозумілим і коротким.
Часто ми маємо умову про форму, наприклад:
$a = 5;$b = 3;if ($a > $b) {echo 'Він більший';} else {echo 'Він менший';}
Таким чином, якщо ми хочемо написати лише одне просте речення, нам доводиться використовувати 4 рядки коду, які можна було б скоротити до одного.
$a = 5;$b = 3;echo 'Це' . ($a > $b ? 'більший' : 'менший');
Як правило, тернарний оператор записується з 3 частин (тому він і називається "тернарним"):
(condition ? 'так' : 'від')
Тернарні оператори дуже часто використовуються на практиці, наприклад, для позначення парних рядків у таблиці:
$pole = [3, 1, 4, 1, 5, 9, 2];for ($i = 0; $pole[$i]; $i++) {echo '<tr class=""' . ($i % 2 ? 'від' : 'навіть') . '">';// Це якось працює з електронною таблицею...// наприклад: echo '<td>' . $field[$i] . '</td>';echo '</tr> </li> <li>Примітка.';}
Досить часто нам потрібно перевірити наявність значення змінної і при необхідності одразу використати її. Якщо його не існує, ми хочемо повернути значення за замовчуванням.
Класичний підхід полягає в тому, щоб робити це так:
$a = 5;$b = 8;$c = $a ? $a : $b;
Якщо змінна $a
існує, то в якості значення використовувати $a
, інакше $b
.
Однак, іноді ми отримуємо значення з функції:
$a = 5;$b = 3;$default = 42;$c = my_function($a, $b) ? my_function($a, $b) : $default;
Такий спосіб виклику є дуже неефективним з точки зору системних ресурсів. Спочатку викликається функція, і якщо вона існує, то викликається ще раз для отримання значення, яке зберігається у змінній $c
.
Це можна було б краще зробити за допомогою допоміжної змінної:
$a = 5;$b = 3;$helper = my_function($a, $b);$default = 42;$c = $helper ? $helper : $default;
Тернарний оператор не завжди варто використовувати, оскільки він має тенденцію викликати плутанину при написанні складних і вкладених умов.
Переконайтеся в цьому на власному прикладі:
$valid = true;$lang = 'французький';$x = $valid? ($lang === 'французький' ? 'Так.' : 'так'): ($lang === 'французький' ? 'не' : 'від');
Чи знали б ви з першого погляду, що змінна $x
буде містити значення oui
?
Після невеликої практики ви могли б, але це не є правильною відповіддю. :)
Тернарні оператори є найпотужнішими у рутинній перевірці (не)існування значень та використанні інших значень за замовчуванням.
Наприклад, ми хочемо перевірити, чи існує основна категорія для статті, і якщо ні, вивести повідомлення про заміну:
echo $mainCategory ?? 'Категорія не існує';
Оператор ??
(два знаки питання) перевіряє, чи існує змінна $mainCategory
і чи не є вона null
. Працює так само, як і функція isset()
.
Дуже часто корисна конструкція для перевірки того, що вихідне значення не є порожнім (тобто не null
, 0
, false
або `''(порожній рядок)).
Це можна записати наступним чином:
$a = 5;$b = 3;$default = 42;$c = my_function($a, $b) ?: $default;
Спочатку викликається function($a, $b)
, потім перевіряється її значення і якщо вона не пуста, то відразу передається у змінну $c
, інакше використовується змінна $default
.
Оператор ?:
працює як оператор !=
в умові (false незалежно від типу даних), і його можна запам'ятати, наприклад, за виглядом смайлика з зачіскою Елвіса.
Оператор ?:
працює починаючи з PHP 7. У старих версіях доводиться обходитися умовою if (...)
, якою можна домогтися такої ж поведінки. Пам'ятайте, що тернарні оператори - це просто спосіб написати те ж саме, що обробляється умовами.
Неіснування значення можна перевірити за допомогою функції isset()
, яка перевіряє, що змінна існує і не є пустою (null
).
Замість коду:
$a = 5;$b = 3;$c = $a ?? $b;
Тоді ми записуємо старішу альтернативу:
$a = 5;$b = 3;$c = isset($a) && $a ?? $b;
Попередження:** Порядок
isset()
та самої змінної має значення. Якби ми змінили порядок і змінна не існувала, то виникла б помилка доступу до неіснуючої змінної.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk