2011-12-20 23 views
5

Tôi gặp vấn đề với nhà điều hành ternary PHP, kể từ PHP phiên bản 5.3 bạn có thể thay thế các nhà điều hành ternary viết tắt với một phiên bản thậm chí ngắn hơnphong cách mới hơn PHP hành ternary đã không mong muốn kết quả với chức năng isset

// Older version 
$route = isset($test) ? $test : 'test is NOT set'; 


// Newer version as of 5.3 
$route = isset($test) ?: 'test is NOT set'; 

Bây giờ trên phiên bản mới hơn, nếu $test không được đặt. nó hoạt động tốt. Tuy nhiên, khi được đặt bởi phương thức isset(), nó sẽ trả lại true hoặc 1 thay vì giá trị.

Tôi có phải sử dụng phương pháp còn lớn tuổi để có được $route để bằng giá trị của $test thay vì một giá trị boolean của 1?

+0

Bạn có thể sử dụng '$ route = $ test?: 'Test is NOT set';' thay vào đó. – FtDRbwLXw6

+1

Nếu bạn không phiền các thông báo lỗi, bạn vẫn có thể sử dụng viết tắt. Nó không phải là cách 'đúng' hoặc 'đẹp' để làm điều đó, nhưng vẫn hoạt động - $ route = @ $ test?: 'Test is NOT set'; –

Trả lời

9

Bạn phải sử dụng phiên bản dài hơn.

Trích dẫn các docs: expr1

Biểu hiện: lợi nhuận expr3 expr1 nếu expr1 đánh giá là TRUE, và expr3 khác.

Vì vậy, hành vi đúng cho phiên bản viết tắt của bạn là trả lại kết quả đánh giá isset($test). Không phải là $test như bạn muốn.

1

Bắt đầu từ PHP 7, bạn có thể sử dụng toán tử rỗng coalescing:

$route = $test ?? 'test is NOT set'; 

tương đương với

$route = isset($test) ? $test : 'test is NOT set'; 

Here bạn có thể tìm thấy một số chi tiết:

The null toán tử kết hợp (??) đã được thêm làm đường cú pháp cho trường hợp thông thường cần sử dụng một bộ ba cùng với isset(). Nó trả về toán hạng đầu tiên của nó nếu nó tồn tại và không phải là NULL; nếu không nó sẽ trả về toán hạng thứ hai của nó.

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