Ternární operátory v PHP (?:)

Ternární operátor umožňuje zkrátit jednoduchou podmínku do jednoho řádku na místě, kde je rozepisování zbytečné, složité, nebo přímo nevhodné.

Často máme podmínku třeba ve tvaru:

1 $a = 5;
2 $b = 3;
3 
4 if ($a > $b) {
5      echo 'Je větší';
6 } else {
7      echo 'Je menší';
8 }

Pokud tedy chceme vypsat jen jednu jednoduchou větu, musíme použít zbytečně 4 řádky kódu, což by šlo zkrátit na jeden.

1 $a = 5;
2 $b = 3;
3 
4 echo 'Je ' . ($a > $b ? 'větší' : 'menší');

Obecně se ternární operátor zapisuje za pomoci 3 částí (proto se jmenuje „ternární“):

1 (podmínka ? pokud je pravda : pokud není pravda)

Ternární operátory se v praxi používají opravdu často, tak třeba k označení sudých řádků v tabulce:

 1 $pole = [3, 1, 4, 1, 5, 9, 2];
 2 
 3 for ($i = 0; $pole[$i]; $i++) {
 4      echo '<tr class="' . ($i % 2 ? 'odd' : 'even') . '">';
 5 
 6           // Tady se nějak pracuje s tabulkou...
 7           // třeba: echo '<td>' . $pole[$i] . '</td>';
 8 
 9      echo '</tr>';
10 }

Příklad použití

Docela často potřebujeme zkontrolovat existenci hodnoty nějaké proměnné a případně jí ihned použít. Pokud neexistuje, tak chceme vrátit defaultní hodnotu.

Klasickým přístupem se to řeší třeba takto:

1 $a = 5;
2 $b = 8;
3 
4 $c = $a ? $a : $b;

Pokud existuje proměnná $a, použijte se jako hodnota $a, jinak $b.

Někdy však hodnotu získáváme z nějaké funkce:

1 $a = 5;
2 $b = 3;
3 $default = 42;
4 
5 $c = funkce($a, $b) ? funkce($a, $b) : $default;

Tento způsob volání je velice neefektivní vzhledem k systémovým prostředkům. Nejprve se totiž musí funkce zavolat, a pokud existuje, tak se volá znovu, pro získání hodnoty, která se uloží do proměnné $c.

To by šlo lépe vyřešit přes pomocnou proměnnou:

1 $a = 5;
2 $b = 3;
3 $pomocnaPromenna = funkce($a, $b);
4 $default = 42;
5 
6 $c = $pomocnaPromenna ? $pomocnaPromenna : $default;

Rozšíření syntaxe od PHP 7

Protože ale Ternární operátory slouží k zjednodušení zápisu, tak je od verze PHP 7 k dispozici ještě elegantnější řešení:

1 $a = 5;
2 $b = 3;
3 $default = 42;
4 
5 $c = funkce($a, $b) ?: $default;

Nejprve se zavolá funkce($a, $b), poté se otestuje její hodnota a když není prázdná, tak se ihned předá do proměnné $c, jinak bude použita proměnná $default.

Alternativně existuje ještě ekvivalent funkce isset(), který kontroluje, že proměnná existuje a není prázdná.

1 $a = 5;
2 $b = 3;
3 
4 $c = $a ?? $b;

Pokud proměnná $a existuje a není prázdná, tak je podmínka splněna.

Ve starších verzích PHP bylo nutné napsat podmínku takto:

1 $a = 5;
2 $b = 3;
3 
4 $c = isset($a) && $a ?? $b;

Upozornění: Na pořadí isset() a samotné proměnné záleží. Pokud bychom pořadí otočili a proměnná neexistovala, tak by se vyvolala chyba přístupu do neexistující proměnné.

Sponzorované odkazy
Pomohl Vám tento článek?