Много лет назад создатель PHP допустил ошибку, которую сейчас слишком поздно исправлять, что привело к бесполезной «ассоциативности» троичного оператора, которая описана в примечании на странице руководства .
Рекомендуется избегать «укладки» троичных выражений.Поведение PHP при использовании более одного троичного оператора в одном выражении неочевидно:
... это потому, что троичные выражения вычисляются слева направо
Так что, когда вынаписал это:
$number =
(! $countOne || ! $countTwo) ?
0.0 :
($countOne > $countTwo) ?
$countTwo / $countOne :
$countOne / $countTwo;
Вы ожидали, что PHP будет понимать это как:
$number =
(
(! $countOne || ! $countTwo)
? 0.0
: (
($countOne > $countTwo)
? $countTwo / $countOne
: $countOne / $countTwo
)
);
То есть выполните первый тест, затем либо дайте окончательный результат 0.0
, либоперейдите ко второму тесту.
Но PHP фактически понимает его как:
$number =
(
(! $countOne || ! $countTwo)
? 0.0
: ($countOne > $countTwo)
)
? $countTwo / $countOne
: $countOne / $countTwo;
Другими словами, сначала вычисляется все первое ... ? ... : ...
выражение, а когда запускается второе,он работает с одной из этих трех возможностей:
$number = 0.0 ? $countTwo / $countOne : $countOne / $countTwo;
$number = true ? $countTwo / $countOne : $countOne / $countTwo;
$number = false ? $countTwo / $countOne : $countOne / $countTwo;
Все они будут оценивать либо $countTwo / $countOne
, либо $countOne / $countTwo
, поэтому существует риск запуска деления на ноль ошибок.