2010-11-18 37 views
20

Tôi có một tuyên bố có điều kiện như sau:PHP Lazy Boolean Đánh giá

if($boolean && expensiveOperation()){ ...} 

Liệu PHP có đánh giá boolean lười biếng, nghĩa là nó sẽ kiểm tra $boolean và nếu nó là sai không bận tâm thực hiện các hoạt động tốn kém? Nếu vậy, tôi nên đặt các biến của mình vào thứ tự nào?

+0

tôi nói chung sẽ kiềm chế không đưa 2 hoạt động trong cùng một dòng mã nếu họ không vốn có liên quan. Nó làm cho khả năng đọc trở nên khó khăn và bạn không đạt được thời gian hoặc nguồn tài nguyên. –

+1

Các câu trả lời cho câu trả lời sai của tôi (hiện đã bị xóa). Tôi nghĩ rằng tôi nhớ đã cố gắng này ra và tìm thấy nó không hoạt động, nhưng tôi rõ ràng là nhầm lẫn. –

+0

@Nathan Ít nhất bạn có huy hiệu Áp lực ngang hàng :) –

Trả lời

23

Có. Nó được gọi là đánh giá ngắn mạch. Xem các nhận xét trên documentation page ...

Đối với đơn đặt hàng, nó thực hiện kiểm tra dựa trên Operator Precedence và sau đó từ trái sang phải. Vì vậy:

A || B || C 

sẽ đánh giá A đầu tiên, và sau đó B chỉ nếu A là sai, và C chỉ khi cả A và B đều sai lầm ...

Nhưng

A AND B || C 

Sẽ luôn luôn đánh giá B || C, vì || có mức độ ưu tiên cao hơn AND (không đúng cho &&).

+0

nếu bạn * muốn * đánh giá phi bờ mạch, bạn có thể sử dụng một đơn & đó sẽ là một hàm boolean union. Nó sẽ tính toán cả hai giá trị và sau đó cố gắng thực hiện AND giữa chúng. – Mikhail

+8

@Mikhail: Có. Nhưng bạn phải cẩn thận vì singe '&' thực sự là một nhà điều hành khôn ngoan. Vì vậy, 'true & 2' sẽ là false (vì' true' là '00000001' và' 2' là '00000010', vì vậy' AND' sẽ là '00000000') ... – ircmaxell

+0

@Alin: Cảm ơn! Dam google đưa tôi đến các tài liệu sai ... Cố định trong câu trả lời. Cảm ơn! – ircmaxell