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_operatorSlevomatCodingStandard.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-operator odstraní ternár, který vrací jen truefalse
  • null-coalescing-operator nahradí isset($a) ? $a : $b operátorem ??

Zdroj

Třída ShortTernaryOperatorRule, fixtury short-ternary-operator.

verze: 1.0