Operátor ternárneho typu umožňuje skrátiť jednoduchú podmienku do jedného riadku na mieste, kde je rozbor zbytočný, zložitý alebo úplne nevhodný.
Ternárne operátory sú skratkou pre podmienky if
a else
, takže ich nemusíte používať. Sú užitočné pre stále sa opakujúce časti overovacej logiky. Vždy používajte formát (podmienka ? kladná logika : záporná logika)
vrátane zátvoriek. Použite na krátke overenie, aby bol kód jasnejší a kratší.
Často máme podmienku napríklad v tvare:
$a = 5;$b = 3;if ($a > $b) {echo 'Je väčší';} else {echo 'Je menší';}
Ak teda chceme napísať len jednu jednoduchú vetu, musíme použiť 4 riadky kódu, ktoré by sa dali zredukovať na jeden.
$a = 5;$b = 3;echo 'Je to' . ($a > $b ? 'väčšie' : 'menšie');
Všeobecne sa ternárny operátor zapisuje pomocou 3 častí (preto sa nazýva "ternárny"):
(condition ? 'áno' : 'z adresy')
Ternárne operátory sa v praxi používajú veľmi často, napríklad na označenie párnych riadkov v tabuľke:
$pole = [3, 1, 4, 1, 5, 9, 2];for ($i = 0; $pole[$i]; $i++) {echo '<tr class=""' . ($i % 2 ? 'z adresy' : 'aj') . '">';// Toto je nejakým spôsobom práca s tabuľkou...// napríklad: echo '<td>' . $field[$i] . '</td>';echo '</tr>';}
Často potrebujeme overiť existenciu hodnoty premennej a v prípade potreby ju okamžite použiť. Ak neexistuje, chceme vrátiť predvolenú hodnotu.
Klasický prístup je takýto:
$a = 5;$b = 8;$c = $a ? $a : $b;
Ak existuje premenná $a
, použije sa ako hodnota $a
, inak $b
.
Niekedy však získame hodnotu z funkcie:
$a = 5;$b = 3;$default = 42;$c = my_function($a, $b) ? my_function($a, $b) : $default;
Tento spôsob volania je z hľadiska systémových zdrojov veľmi neefektívny. Najprv sa musí zavolať funkcia, a ak existuje, zavolá sa znova, aby sa získala hodnota, ktorá sa uloží do premennej $c
.
To by sa dalo lepšie riešiť pomocou pomocnej premennej:
$a = 5;$b = 3;$helper = my_function($a, $b);$default = 42;$c = $helper ? $helper : $default;
Trojčlenný operátor sa neoplatí vždy používať, pretože pri písaní zložitých a vnorených podmienok spôsobuje zmätok.
Pozrite si príklad:
$valid = true;$lang = 'Francúzsky';$x = $valid? ($lang === 'Francúzsky' ? 'oui' : 'áno'): ($lang === 'Francúzsky' ? 'nie' : 'z adresy');
Vedeli by ste na prvý pohľad, že premenná $x
bude obsahovať hodnotu oui
?
Po troche praxe by ste mohli, ale to nie je správna odpoveď. :)
Ternárne operátory sú najsilnejšie pri rutinnom overovaní (ne)existencie hodnôt a používaní iných predvolených hodnôt.
Napríklad chceme skontrolovať, či pre článok existuje hlavná kategória, a ak nie, vypísať náhradnú správu:
echo $mainCategory ?? 'Kategória neexistuje';
Operátor ??
(dva otázniky) kontroluje, či premenná $mainCategory
existuje a nie je null
. Funguje rovnako ako funkcia isset()
.
Veľmi často užitočná konštrukcia na overenie, či výstupná hodnota nie je prázdna (t. j. nie je null
, 0
, false
alebo `''(empty string)).
To sa dá zapísať takto:
$a = 5;$b = 3;$default = 42;$c = my_function($a, $b) ?: $default;
Najprv sa zavolá funkcia($a, $b)
, potom sa otestuje jej hodnota a ak nie je prázdna, okamžite sa odovzdá premennej $c
, inak sa použije premenná $default
.
Operátor ?:
funguje podobne ako operátor !=
v podmienke (false bez ohľadu na typ údajov) a možno si ho zapamätať napríklad tak, že vyzerá ako smajlík s vlasmi Elvisa.
Operátor ?:
funguje od PHP 7. V starších verziách sa musíme uspokojiť s podmienkou if (...)
, ktorá môže dosiahnuť rovnaké správanie. Nezabudnite, že ternárne operátory sú v skutočnosti len skratkou na zápis toho istého, čo sa rieši pomocou podmienok.
Neexistenciu hodnoty možno skontrolovať pomocou funkcie isset()
, ktorá overí, či premenná existuje a nie je prázdna (null
).
Namiesto kódu:
$a = 5;$b = 3;$c = $a ?? $b;
Potom zapíšeme staršiu alternatívu:
$a = 5;$b = 3;$c = isset($a) && $a ?? $b;
Upozornenie: Záleží na poradí
isset()
a samotnej premennej. Ak by sme zmenili poradie a premenná by neexistovala, vyvolalo by to chybu prístupu k neexistujúcej premennej.
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: ... | sk