соответствующий вложенный тернарный оператор в php? и в каком порядке оцениваются вложенные короткие присвоения рук? объясните, что тройные операторы в PHP не оценивают, как ожидалось.
См. Этот пример:
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 0 ? 0 : 1 ? 1 : 2 ? 2 : 3; //2
Даже прочитав документы, я все еще не понимаю, почему короткая и длинная форма оцениваются по-разному?
Вы уже начинаете с неправильного предположения, что эти 2 строки кода идентичны, потому что они не являются. Тернарный (expression? IF TRUE: IF FALSE
) оператор остается ассоциативным.
Поэтому, если вы шаг за шагом, вы можете увидеть это лучше:
Первая тройная линия:
echo 0 ?: 1 ?: 2 ?: 3; //1
С круглыми скобками:
echo ((0 ?: 1) ?: 2) ?: 3; //1 └──────┘ //0 → FALSE ↓ //Second expression: 1 echo ((1) ?: 2) ?: 3; //1 └────────┘ //1 → TRUE ↓ //First expression: 1 echo (1) ?: 3; //1 └──────┘ //1 → TRUE ↓ //First expression: 1 echo 1; //1
Вторая тройная линия:
echo 0 ? 0 : 1 ? 1 : 2 ? 2 : 3; //2
С круглыми скобками:
echo ((0 ? 0 : 1) ? 1 : 2) ? 2 : 3; //2 └─────────┘ //0 → FALSE ↓ //Second expression: 1 echo ((1) ? 1 : 2) ? 2 : 3; //2 └───────────┘ //1 → TRUE ↓ //First expression: 1 echo (1) ? 2 : 3; //2 └─────────┘ //1 → TRUE ↓ //First expression: 2 echo 2; //2