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:

$a = 5;
$b = 3;

if ($a > $b) {
     echo 'Je větší';
} else {
     echo 'Je menší';
}

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.

$a = 5;
$b = 3;

echo 'Je ' . ($a > $b ? 'větší' : 'menší');

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

(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:

$pole = [3, 1, 4, 1, 5, 9, 2];

for ($i = 0; $pole[$i]; $i++) {
     echo '<tr class="' . ($i % 2 ? 'odd' : 'even') . '">';

          // Tady se nějak pracuje s tabulkou...
          // třeba: echo '<td>' . $pole[$i] . '</td>';

     echo '</tr>';
}

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:

$a = 5;
$b = 8;

$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:

$a = 5;
$b = 3;
$default = 42;

$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:

$a = 5;
$b = 3;
$pomocnaPromenna = funkce($a, $b);
$default = 42;

$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í:

$a = 5;
$b = 3;
$default = 42;

$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á.

$a = 5;
$b = 3;

$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:

$a = 5;
$b = 3;

$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?