short-ternary-operator
Ternár, který ve své prostřední části opakuje podmínku, se píše zkráceně jako ?:.
Opravuje · v presetech dresscode/nette · pokrývá
ternary_to_elvis_operator, SlevomatCodingStandard.ControlStructures.RequireShortTernaryOperator
Co pravidlo hlídá
Zápis $a ? $a : $b říká dvakrát totéž: když $a platí, vrať $a. PHP na to má
zkrácený ternár $a ?: $b, který dá stejný výsledek a podmínku vyhodnotí jen jednou. Pravidlo najde ternár,
jehož prostřední část je doslova stejná jako podmínka, a prostřední část vypustí.
Zkrácení mění počet vyhodnocení podmínky a to nemusí být neškodné:
array_shift($queue) ? array_shift($queue) : null odebere z fronty dva prvky, zkrácená podoba jen jeden. Pravidlo
proto zkracuje pouze výrazy, jejichž opakované čtení nemá vedlejší účinek: proměnné, prvky polí, vlastnosti,
konstanty. Volání funkce nebo metody nechá být, i když se opakuje slovo od slova. Tohle je místo, kde je vidět, co dá
strom: PHP CS Fixer označuje svůj protějšek ternary_to_elvis_operator jako risky, protože nad polem tokenů
nerozezná volání od proměnné a nechává tu úvahu na vás. Tady ji udělá pravidlo.
Ternár rozepsaný přes několik řádků a ternár s komentářem mezi otazníkem a dvojtečkou pravidlo nechává, protože by při zkrácení muselo komentář zahodit.
Příklad
$name = $input ? $input : 'anonymous'; // A ternary repeating its condition must be written '?:'
$size = $options['size'] ? $options['size'] : 10; // A ternary repeating its condition must be written '?:'
$title = $this->title ? $this->title : $default; // A ternary repeating its condition must be written '?:'
$next = array_shift($queue) ? array_shift($queue) : null;
$name = $input ?: 'anonymous';
$size = $options['size'] ?: 10;
$title = $this->title ?: $default;
$next = array_shift($queue) ? array_shift($queue) : null;
Poslední řádek zůstal: array_shift() má vedlejší účinek, takže by zkrácení změnilo chování
programu.
Související pravidla
useless-ternary-operatorodstraní ternár, který vrací jentrueafalsenull-coalescing-operatornahradíisset($a) ? $a : $boperátorem??
Zdroj
Třída ShortTernaryOperatorRule, fixtury short-ternary-operator.