2012-04-08 41 views
6

Tôi là một chút của một freak tối ưu hóa (ít nhất là theo định nghĩa của tôi) và câu hỏi này đã được bugging cho tôi một thời gian khá.PHP || và && logic tối ưu hóa

Tôi tự hỏi nếu PHP hiện một số tối ưu hóa trên & & và ||: Lấy ví dụ sau đây:

$a = "apple"; 
$b = "orange"; 
if ($a == "orange" && $b == "orange") { 
    //do stuff 
} 

Khi mã thực thi, nó sẽ kiểm tra nếu $ a là bằng "cam. " Trong trường hợp này thì không. Tuy nhiên, có một toán tử & &. Vì phần đầu tiên ($ a == "cam") đã trả về false, PHP sẽ vẫn kiểm tra xem $ b có bằng "màu da cam không?"

Tôi có cùng một câu hỏi cho ||:

$a = "orange"; 
$b = "orange"; 
if ($a == "orange" || $b == "orange") { 
    //do stuff 
} 

Khi kiểm tra nếu $ a là bằng "cam", nó trả về true. Vì điều đó sẽ làm cho || toán tử trả về true, PHP sẽ kiểm tra phần thứ hai của || (vì chúng ta đã biết nó sẽ đúng)?

Hy vọng rằng tôi có ý nghĩa ở đây và hy vọng ai đó có câu trả lời cho tôi. Cảm ơn bạn!

+0

Đó là những gì tôi đã luôn luôn giả định. Và, trên thực tế, toán tử AND hoạt động theo cách đó. Ví dụ, tôi có thể làm 'if (isset ($ a) && $ a instanceof SomeClass && $ a-> someMethod() == 'orange')' và nó phải vượt qua từng bước của điều kiện để kiểm tra tiếp theo. Nhưng, tôi không có bất cứ điều gì để ủng hộ tôi ngoại trừ thực tế tôi chỉ biết nó hoạt động. –

+2

Tại sao không thử?'if (true || die()) {echo '1';}' và 'if (true && die()) {echo '1';}' –

Trả lời

6

Sử dụng PHP short circuit evaluation với điều kiện nhị phân (chẳng hạn như &&, || hoặc tương đương không đổi), vì vậy nếu kết quả đánh giá LHS có nghĩa là RHS là không cần thiết, nó sẽ không.

Ví dụ ...

method_exists($obj, 'func') AND $obj->func(); 

... là một khai thác thực tế này. RHS sẽ chỉ được đánh giá nếu LHS trả về giá trị thực tế trong ví dụ này. Logic có ý nghĩa ở đây, vì bạn chỉ muốn gọi một phương thức nếu nó tồn tại (miễn là bạn không sử dụng __call(), nhưng đó là một câu chuyện khác).

Bạn cũng có thể sử dụng OR theo cách tương tự.

defined('BASE_PATH') OR die('Restricted access to this file.'); 

Mẫu này thường được sử dụng làm dòng đầu tiên trong tệp PHP được bao gồm và không được truy cập trực tiếp. Nếu hằng số BASE_PATH không tồn tại, LHS là falsy để nó thực hiện RHS, trong đó die() s tập lệnh.

+0

Bạn có thể viết lại điều đó theo thuật ngữ của giáo dân không? Haha. Tôi sẽ thực hiện tìm kiếm nhanh trên google về những từ đó. – fruitcup

+0

@DrAgonmoray sau điều kiện đầu tiên, PHP sẽ chỉ đánh giá các điều kiện bổ sung nếu cần thiết :) – rawb

+0

@rawb Cảm ơn. :) – fruitcup

1

Có, PHP ngắn mạch các toán tử &&||, nghĩa là không, toán hạng bên phải sẽ không được đánh giá nếu giá trị của toán hạng trái nghĩa là không cần đánh giá. Không cần phải tối ưu hóa chúng. Bạn có thể kiểm tra nó như thế này:

function one() { 
    echo "One"; 
    return false; 
} 

function two() { 
    echo "Two"; 
    return true; 
} 

one() && two(); // Outputs One 
echo "\n"; 
two() || one(); // Outputs Two 

Here's a demo. Nếu không có ngắn mạch, bạn sẽ nhận được:

OneTwo 
TwoOne