2011-06-20 49 views
1

可能重複:
PHP - and/or keywords
PHP shorthand syntaxPHP速記邏輯運算符AND和OR

快速的問題。我一直在這個地方的圖書館裏看到速記表達,儘管我已經是一名PHP開發人員已經有3年多了,但我很難理解下面的評估方式。

當PHP解釋器遇到它時,它是如何處理下面的代碼行的?

<?php 
    defined('foo') OR exit('foo is not defined!'); 

    $foo AND $this->bar(); 

我猜測,這是明顯的條件執行 - 即第二條語句將不會得到執行,除非第一位是真的......但使用的位運算符的迷惑了我一下。

有人可以詳細說明嗎?

謝謝:)

+0

@戈登 - 沒有不是真的。我知道&&也是和AND一樣,同樣也是||和OR。我想詢問速記邏輯 - 它現在已經向我指出的短路評價。 – George

+1

那麼,如何http://stackoverflow.com/questions/2475047/php-shorthand-syntax呢? – Gordon

+0

有人只是掛我說。你的問題究竟是什麼? – George

回答

1

回來時,我正在學習PHP看完記得「做或死」式的命令並沒有完全在時間瞭解他們,一個典型的例子是:

mysql_connect() or die('couldn\'t connect'); 

記住,條件只會如果需要運行,例如:

if (a == b && b == c) 

這裏b == c只會在a = b時才被測試。相同的理論適用於或:

if (a == b || b == c) 

現在b == c將只在​​測試!= b。

在這種情況下,你是靠這個才能運行在特定條件下的命令(退出或$這個 - >巴())上。

知道...退出()是在這種情況下是一個壞主意 - 如果你退出(「出事了」)沒有什麼任何人都可以做,以對用戶隱藏這個錯誤,也很可能發行其中,500內部服務器錯誤會更適合一個200 OK HTTP狀態,我會考慮更多的東西一樣:

defined('foo') OR throw new Exception('foo is not defined!'); 

在這裏,你有一個機會來捕獲該異常,或者至少讓PHP抓住它和問題一個500的身份。

+0

嘿馬特,謝謝你的回答。是的,我知道這不是最好的方法。實際上,我只是從大多數文件中摘取了CodeIgniter核心中的例子......這是一個很重視PHP 4的框架。 – George

4

我認爲,這是短路評價的一種形式:http://en.wikipedia.org/wiki/Short-circuit_evaluation

實質上,評估整個表達式,解釋器短路時,一旦它的某些結果。例如:

true OR do_something(); 

這個表達式永遠不會調用do_something(),因爲OR的第一個操作數是真實的,所以整個表達式必須是真實的。

2

比您想象的要複雜得多。 or關鍵字與||相同,但優先級較低。有關詳細信息,請參閱corresponding PHP page

該聲明的實際執行依賴於涉及邏輯運算符的單獨概念:短路。這意味着,在or的情況下,如果第一條語句結果爲真,則不評估第二條語句。 (由於在有條件的,例如,整個情況就沒有永遠需要看下半年返回true。)

1

有時你必須看起來像一個功能:

function test() 
{ 
    $foo = TRUE; 
    $bar = FALSE; 

    return $foo && $bar; 
} 

在這種情況下,如果有的話:

$bla = test(); 
if($bla) { 
    ... do something 
} 

「......做某事」不會被執行,因爲函數作爲一個整體返回false。

回報$ foo的& & $巴意味着這兩個變量必須是真實的,以使函數返回true。

另一方面,如果它聲明:return $ foo || $酒吧;那麼函數會返回true,因爲至少有一個變量是真的。