2011-11-11 21 views
9

Với biểu thức sau đây:Bỏ phần thứ hai của các nhà điều hành ternary

$att['menutext'] = isset($attrib_in['i_menu_text']) ? : $this->getID(); 

Nếu nó trả về true, sẽ $att['menutext'] được thiết lập để true hoặc $this->getID()?

+0

Điều này sẽ không thực thi, cú pháp không hợp lệ. 'Lỗi phân tích cú pháp: lỗi cú pháp, không mong muốn ':' trên dòng X' – nickb

+0

Không có trong PHP 5.3. http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary –

+0

Điều đó giải thích tại sao nó không hoạt động trên 5.2.5 :) – nickb

Trả lời

2

Nó chỉ giống như sau

$att['menutext'] = isset($attrib_in['i_menu_text']) ? true : $this->getID();

+10

Chỉ cần làm rõ cho người qua đường , phiên bản lối tắt này của toán tử ternery trả về bất kỳ điều kiện nào đánh giá, không chỉ Boolean 'true' trong mọi trường hợp. Trong trường hợp này, điều kiện sẽ đánh giá là 'true'. Nhưng nếu bạn có '$ foo = 42? : false; ',' $ foo' sẽ được gán '42'. – Wiseguy

+0

Tôi đặc biệt ấn tượng với thực tế là câu trả lời và nhận xét này thực sự đã trả lời câu hỏi mà tôi ** muốn hỏi cũng như câu hỏi mà tôi đã ** yêu cầu –

+0

Câu trả lời này không đúng, không có 'isset' ngụ ý. – chx

0

này sẽ không thực hiện, đó là cú pháp hợp lệ cho PHP < 5.3.

Parse error: syntax error, unexpected ':' on line X

Nếu bạn muốn giá trị được thiết lập là true, sau đó sử dụng đúng:

$att['menutext'] = isset($attrib_in['i_menu_text']) ? true : $this->getID(); 

Hoặc nó có thể có nhiều khả năng mà bạn muốn:

$att['menutext'] = isset($attrib_in['i_menu_text']) ? $attrib_in['i_menu_text'] : $this->getID(); 
14

Theo this reference:

Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.

+0

thats thông minh, cảm ơn –

1

không bao giờ được thử nghiệm trước đó, nhưng nó khá dễ dàng để kiểm tra:

<?php var_dump(TRUE ? : 'F'); ?> 

và nói nó: bool (true)

2

Vâng, trong phiên bản 5.3+ biểu thức giữa là không bắt buộc và trả về true.

$a = (true ? : 1); // $a evaluates to true. 
$a = (false ? : 1); // $a evaluates to 1. 
+1

Chỉ cần làm rõ cho người qua đường, phiên bản phím tắt này của nhà điều hành ternery trả về bất cứ điều kiện nào đánh giá, không chỉ Boolean 'true' trong mọi trường hợp. Trong trường hợp này, điều kiện sẽ đánh giá là 'true'. Nhưng nếu bạn có '$ foo = 42? : false; ',' $ foo' sẽ được gán '42'. – Wiseguy

+0

Có cách nào để sử dụng biểu thức đầu tiên do kết quả của biểu thức thứ hai hoặc thứ ba không? Giống như '$ db-> get ('id', 'users', 'id', $ id)? previous_query: anything_else'. Bây giờ bạn phải viết '$ db-> get ('id', 'users', 'id', $ id)? $ db-> get ('id', 'users', 'id', $ id): anything_else'. Mà làm cho hai yêu cầu để db. Bạn có thể lưu nó vào thùng trước đó nhưng đó không phải là ý tôi. Không thể? –

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