Ternární operátor

Školení, která pořádám

Na úvod se sluší poznamenat, že ternární operátor je jakýkoliv operátor, který pracuje se třemi operandy. V PHP a řadě dalších jazyků je ale takový operátor jediný, a proto se mu často říká prostě ternární. Operátor slouží k podmíněnému vyhodnocení výrazu.

<?php
// označení sudých a lichých řádků příslušnou třídou
echo "<tr class='" . ($i % 2 == 0 ? "even" : "odd") . "'>";

// bez použití ternárního operátoru
if ($i % 2 == 0) {
    echo "<tr class='even'>";
} else {
    echo "<tr class='odd'>";
}
?>

Někomu se použití ternárního operátoru zdá nepřehledné, podle mě kód naopak zpřehledňuje a zjednodušuje jeho správu. Jako se vším se to ale samozřejmě nesmí přehánět. Abych vždy na první pohled poznal, kde ternární operátor začíná a končí, uzavírám ho vždy do závorek – ono to většinou ani jinak nejde, protože má poměrně nízkou prioritu.

Jakub Vrána, Výuka, 28.3.2005, diskuse: 10 (nové: 0)

Diskuse

Jan Tichý:

Možná ještě jednodušeji a přehledněji by stačilo:

<?php
echo '<tr class="' . ($i % 2 ? 'odd' : 'even') . '">';
?>

BTW spousta lidí má ještě ve zvyku do závorek důsledně uzavírat i samotnou podmínku, což ale podle mne občas kód spíš znepřehledňuje:

<?php
echo '<tr class="' . (($i % 2) ? 'odd' : 'even') . '">';
?>

ikona llook:

Já teda podmínku dost často dávám do závorky. On má ternár sice nízkou prioritu, ale radši dám o závorky víc než pak hledat chybu. Chyby v prioritě operátorů se tak těžce hledají...

Často taky tyhle výrazy rozepisuju na více řádek tímto způsobem:
<?php
$sql
.= 'WHERE id';
$sql .= (is_null($id)
    ? ' IS NULL'
    : '='.((int) $id)
);
?>
S tímto zápisem snad už nikomu nemůže ternární operátor připadat nepřehledný.

martin:

"S tímto zápisem snad už nikomu nemůže ternární operátor připadat nepřehledný."
...s timto zapisem navic ztratil ternarni operator temer vyznam :)

pif:

jo jedien viceradkova syntax :)

kozotoč:

<?php echo'<tr class="'.($i&1?'odd':'even').'">';?>

kozotoč:

ještě by se z toho dal vynechat středník (nebo pokud jsem si jistý, že nebudou zakázáný shorttags, použít <?=...?>) a výsledek bude o pár nanosekund rychlejší než verze pana Vrány ;-) ale nevím, jak to bude s přehledností kódu...

omar:

Bez strednika ti to nikdy valit nebude..

Jan Švábík:

Bude:

<?='<tr class="'.(is_int($i/2)?'odd':'even'.'">' ?>

PrAvDíK:

<?php echo'<tr class="'.(is_int($i/2)?'odd':'even'.'">';?>

Besir:

Nevím čím to, záleží kde používáte, ale já třeba v Symfony při použití PHP template raději používám takovýto zápis

<tr class="<?php echo $line %2 ? "even" : "odd"; ?>">

popřípadě, pokud vím že aplikace bude na serveru se short_tags on tak

<tr class="<?= $line %2 ? "even" : "odd" ?>">

Myslím si že je dostatečně přehledné a použitelné

Vložit příspěvek

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2016 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.