2010-08-27 47 views
11

Tôi sử dụng toán tử bậc ba khá thường xuyên nhưng tôi không thể tìm thấy bất kỳ thứ gì trong tài liệu về điều này và tôi luôn tự hỏi nó.Làm rõ toán tử Ternary PHP

Sau đây là một ví dụ tốt:

echo ($something->message ? $something->message : 'no message'); 

như bạn có thể thấy, nếu $ something-> nhắn là đúng, chúng tôi quay trở lại $ something-> tin nhắn, nhưng tại sao viết nó hai lần? Có cách nào để làm điều gì đó như:

echo ($something->message ? this : 'no message'); 

Bây giờ tôi không thạo về mặt lý thuyết lập trình, do đó, nó có thể là có một lý do mà trước đây không thể được tham chiếu với một cái gì đó như "này" nhưng tại sao không? Điều này sẽ không dòng dòng việc sử dụng các nhà điều hành ternary? Đối với một cái gì đó giống như ví dụ của tôi nó khá vô dụng, nhưng chúng ta hãy nói rằng nó

echo (function(another_function($variable)) ? function(another_function($variable)) : 'false'); 

Tôi không thể tìm cách nào để làm điều này, vì vậy tôi giả định đó là không thể, nếu tôi sai xin vui lòng thông tôi, nếu không: tại sao không? Tại sao điều này là không thể, lý do kỹ thuật là gì, hay chỉ là điều gì đó chưa bao giờ xảy ra? Tôi có nên tuyên bố nó như là một biến và sau đó thử nghiệm đối với biến đó?

+0

có thể trùng lặp của [PHP có một thành phần gán mặc định như perl?] (Http://stackoverflow.com/questions/2958630/does-php-have-a-default-assignment-idiom-like-perl) – outis

Trả lời

19

Kể từ PHP 5.3, bạn có thể bỏ phần giữa của toán tử bậc ba. Biểu thức expr1?: Expr3 trả về expr1 nếu expr1 đánh giá thành TRUE và expr3 nếu không.

Source

Ví dụ

$used_value = function1() ?: $default_value; 

là giống như

$check_value = function1(); //doesn't re-evaluate function1() 
if($check_value) { 
    $used_value = $check_value; 
} else { 
    $used_value = $default_value; 
} 

Word cho khôn ngoan

Nếu bạn sẽ tùy thuộc vào việc định hình thành TRUE, điều quan trọng là phải hiểu những gì S typ được nhập thành TRUE và những gì sẽ không. Đó có thể là giá trị đánh răng trên PHP type juggling và đọc type conversion tables. Ví dụ: (bool)array()FALSE.

+1

Bất cứ ai gửi miếng vá đó là anh hùng của tôi. Tôi chỉ đang đọc trang đó và dường như bỏ qua ngay phần đó. Cảm ơn, có lẽ tôi nên nâng cấp sau đó. Tôi sẽ chấp nhận câu trả lời của bạn khi hết thời hạn! – sam

+0

'echo ($ something-> message?: 'No message');' trong trường hợp ví dụ đầu tiên của OP. –

+1

+1 Hãy để nó vào php để làm bạn ngạc nhiên với việc thực hiện tối nghĩa của các nhà điều hành ternary của tất cả mọi thứ :) gotta tình yêu incongruities .. –

Các vấn đề liên quan