PHP Manual

Тернарні оператори в PHP (?:) - умова в одному рядку

26. 11. 2019

Obsah článku

Тернарний оператор дозволяє скоротити просту умову в один рядок в тому місці, де синтаксичний розбір непотрібний, складний або відверто недоречний.

TL;DR

Тернарні оператори є скороченням для умов "якщо" та "інакше", тому їх можна не використовувати. Вони корисні для постійно повторюваних фрагментів логіки перевірки. Завжди використовуйте формат (умова ? позитивна логіка : негативна логіка), включаючи круглі дужки. Використовуйте для короткої перевірки, щоб зробити код більш зрозумілим і коротким.

Основні визначення

Часто ми маємо умову про форму, наприклад:

$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

Оператор ?: працює починаючи з 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:

Související články

1.
2.
Status:
All systems normal.
2024