Tại sao bản in này 2?Toán tử ternary PHP không hoạt động như mong đợi
echo true ? 1 : true ? 2 : 3;
Với sự hiểu biết của tôi, nó nên in 1.
Tại sao nó không làm việc như mong đợi?
Tại sao bản in này 2?Toán tử ternary PHP không hoạt động như mong đợi
echo true ? 1 : true ? 2 : 3;
Với sự hiểu biết của tôi, nó nên in 1.
Tại sao nó không làm việc như mong đợi?
Bởi vì những gì bạn đã viết là giống như:
echo (true ? 1 : true) ? 2 : 3;
và như bạn đã biết 1 được đánh giá để true
.
gì bạn mong đợi là:
echo (true) ? 1 : (true ? 2 : 3);
Vì vậy, luôn luôn sử dụng dấu ngoặc để tránh nhầm lẫn như vậy.
Như đã được viết, các biểu thức bậc ba được để lại liên kết trong PHP. Điều này có nghĩa là lần đầu tiên sẽ được thực hiện đầu tiên từ bên trái, sau đó là thứ hai và cứ tiếp tục như vậy.
Sử dụng dấu ngoặc đơn khi nghi ngờ.
Toán tử bậc ba trong PHP có liên kết trái ngược với các ngôn ngữ khác và không hoạt động như mong đợi.
Tách hạng thứ hai riêng biệt với dấu ngoặc đơn.
echo true ? 1 : (true ? 2 : 3);
từ docs
Example #3 Non-obvious Ternary Behaviour
<?php
// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');
// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right
// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');
// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>
Có bao giờ một lý do chính đáng để các nhà khai thác ternary tổ ... và hướng dẫn cảnh báo rõ ràng về vấn đề này bạn –
http://php.net/manual/en/ language.operators.comparison.php - 'Lưu ý: Bạn nên tránh" xếp chồng "các biểu thức bậc ba. Hành vi của PHP khi sử dụng nhiều hơn một toán tử bậc ba trong một câu lệnh đơn là không rõ ràng' - các biểu thức bậc ba là liên kết trái. – DaveRandom
nếu bạn * phải * lồng tổ hợp tác ba đại số của bạn, sau đó sử dụng các dấu ngoặc xung quanh chúng. Trong thực tế, tôi khuyên bạn nên sử dụng dấu ngoặc vuông quanh ternaries anyway; nó làm cho chúng dễ đọc hơn ngay cả khi bạn không lồng ghép chúng. – SDC