shortTernaryForRepeatedCondition
Ternár, který ve své prostřední části opakuje podmínku, se píše zkráceně jako ?:.
Opravuje · ve skupině modernization · v presetech 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, kdežto zkrácená podoba jen jeden.
Pravidlo proto zkracuje jen výrazy, jejichž opakované čtení nemá vedlejší účinek: proměnné, prvky polí, vlastnosti,
konstanty, skalární hodnoty a pole z nich, to vše i v závorkách nebo s unárním operátorem jako !$a.
Volání funkce nebo metody nechá být, i kdyby se opakovalo slovo od slova. Právě tady je vidět, co dává strom: PHP CS
Fixer označuje svůj protějšek ternary_to_elvis_operator za rizikovou opravu (risky fix), protože nad polem
tokenů nerozezná volání od proměnné a tu úvahu nechává na vás. Tady ji za vás 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
uselessTernaryOperatorodstraní ternár, který vrací jentrueafalsenullCoalescingForNullTernarynahradíisset($a) ? $a : $boperátorem??
Zdroj
Třída ShortTernaryForRepeatedConditionRule, fixtury shortTernaryForRepeatedCondition.