PHP вложенный условный оператор ошибка? - PullRequest
4 голосов
/ 17 декабря 2009
   
                return
                    true  ? 'a' :
                    false ? 'b' :
                                                           'c';

Это должно вернуть 'a', но это не так. Вместо этого он возвращает «b». Есть ли ошибка в порядке PHP обработки различных частей условных операторов?

Я получил идею от Является ли несколько условных операторов в этой ситуации хорошей идеей? , где, кажется, она работает правильно.

(истина и ложь для целей примера, конечно. В реальном коде это операторы, которые оценивают в истину и ложь соответственно. Да, я знаю это точно)

Ответы [ 4 ]

8 голосов
/ 17 декабря 2009

Рекомендуется избегать «укладка» троичных выражений. РНР поведение при использовании более одного троичный оператор в пределах одного утверждение неочевидно

Из PHP Manual в разделе "Неочевидное троичное поведение".

Тернарные операторы оцениваются слева направо, поэтому если вы не добавите их в скобки, они не будут вести себя так, как вы ожидаете. Следующее будет работать, хотя,

return (true ? "a" : (false ? "b" : "c"));
6 голосов
/ 17 декабря 2009

Подозреваю, что он оценивает (true ? 'a' : false) как вход для второго троичного оператора и интерпретирует 'a' как истину. Попробуйте использовать брекетинг.

3 голосов
/ 17 декабря 2009

порядок операций:

>>> return true ? 'a' : false ? 'b': 'c';
'b'
>>> return true ? 'a' : (false ? 'b': 'c');
'a'
0 голосов
/ 21 декабря 2016

Позвольте мне объяснить так же, как мне это объяснили. Но вы должны обратить внимание в скобках, чтобы понять, что происходит.

PHP

Код PHP ниже

true ? "a" : false ? "b" : "c"

Эквивалентно:

(true ? "a" : false) ? "b" : "c"

Другие языки

код ниже

true ? "a" : false ? "b" : "c"

Эквивалентно:

true ? "a" : (false ? "b" : "c")
...