2012-04-08 47 views
6

我是一個優化怪胎(至少根據我的定義),這個問題一直困擾着我很長一段時間。PHP ||和&&邏輯優化

我想知道如果PHP確實對& &一些優化和||: 看看下面的例子:

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

當該代碼執行時,它會檢查,如果$ a等於「橙色。 「在這種情況下,它不是。但是,運營商有一個& &運營商。由於第一部分($ a ==「orange」)已經返回false,PHP會檢查$ b是否等於「orange?」

我有||同樣的問題:

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

當檢查,如果$ a等於 「橙色」,則返回true。因爲這會使||運算符返回true,PHP甚至會檢查||的第二部分(因爲我們已經知道它會是真的)?

希望我在這裏有意義,希望有人對我有一個答案。謝謝!

+0

這就是我一直認爲。而且,在實踐中,AND運算符確實以這種方式工作。例如,我可以做'if(isset($ a)&& $ a instanceof SomeClass && $ a-> someMethod()=='orange')',它必須通過條件的每一步來測試下一個。但是,除了我知道它的作用之外,我沒有任何支持我的東西。 – 2012-04-08 02:57:00

+2

爲什麼不嘗試呢?'if(true || die()){echo'1';}'和'if(true && die()){echo'1';}' – 2012-04-08 03:00:44

回答

6

PHP使用short circuit evaluation與二進制條件(如&&,||或它們的常量等價物),所以如果評估LHS的結果意味着RHS是沒有必要的,它不會。

例如...

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

...就是這一事實的剝削。只有在本例中LHS返回truthy值時纔會評估RHS。這個邏輯在這裏是有意義的,因爲如果它只存在(只要你沒有使用__call(),但那是另一回事),你只想調用一個方法。您也可以以類似的方式使用OR

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

此模式經常用作PHP文件中的第一行,這些文件意味着被包含在內而不是直接訪問。如果BASE_PATH常數不存在,那麼LHS是falsy因此它執行RHS,即die()的腳本。

+0

你可能用通俗的話來說呢?哈哈。我會對這些詞做一個快速的谷歌搜索。 – fruitcup 2012-04-08 02:56:27

+0

@DrAgonmoray在第一個條件之後,PHP將只在必要時評估附加條件:) – rawb 2012-04-08 02:57:24

+0

@rawb謝謝。 :) – fruitcup 2012-04-08 02:57:48

1

是的,PHP將&&||運算符短路,這意味着否,如果左操作數的值表示不需要評估右運算數,則不會評估右運算數。沒有必要優化它們。你可以像這樣的測試:

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.如果沒有短路,你會得到:

OneTwo 
TwoOne