2011-08-30 91 views
2

處理故障的常用方法是:'或'被視爲返回語句的布爾檢查嗎?

$result = mysql_query("SELECT * FROM table1") or myFailureFunction(); 

的結果是,當查詢失敗,myFailureFunction()被調用。

有沒有什麼情況下,下面的代碼不完全一樣?

$result = mysql_query("SELECT * FROM table1"); 
if(!$result) 
{ 
    myFailureFunction(); 
} 

注:

  1. 我曾與連接失敗,SQL語法失敗和空測試結果,似乎他們所有的工作。我想知道是否有任何情況下,它不會工作。
  2. 我知道有很多更好的方法來處理失敗。
  3. 有一個問題解決了or的布爾性質。我想知道的是,or是在復活的結果還是別的東西上運行?問題:PHP: 'or' statement on instruction fail: how to throw a new exception?
+0

感謝大家的好的答案。在這種情況下,「短路評估」的使用並沒有真正發生,但總體上是有意義的。下面關於'null'和'false'返回可能性差異的討論正是我所期待的。謝謝 –

回答

2

在你的情況,他們是完全一樣的,因爲short circuit evaluation,但是如果返回null或其他一些虛假的價值,它會有所作爲。注:

function f(){return false;} 
function w(){return "w";} 
$a = f() or w(); 
echo isset($a); 
// 1 (true). $a === FALSE! 

現在,注意到一個缺乏回報會發生什麼:

function f(){} 
function w(){return "w";} 
$a = f() or w(); 
echo isset($a); 
// nothing (false) 
2

它們實際上是等效的。唯一的區別是$result在較長版本之後未定義,而在較短版本之後它將具有值FALSE

與大多數語言一樣,PHP使用short-circuit evaluation實現布爾操作。如果左側值爲真,則不會評估右側值,因此該功能將不會運行。如果發生任何錯誤,則左側值爲FALSE,因此會導致評估右側。

1

它們完全相同。失敗函數只會在mysql_query返回布爾值false時纔會被調用。在這種情況下,PHP使用短路布爾評估。一旦它有足夠的數據來確定整個表達式的布爾結果是什麼,它就會停止評估它的其餘部分。

考慮一下,如果PHP沒有短路,這將發生什麼:

$result = mysql_query(...) or die(mysql_error()); 

如果雙方進行了評估/執行,那麼該腳本會死,即使查詢本身沒有返回false。

1

兩種說法都一樣。 PHP使用布爾表達式的短路評估。這意味着它只在第一個表達式爲false時才評估表達式。這就是您可以將其用作簡單控制結構的原因。 or也有很低的優先級

0

或運行「不爲0」(或在這種情況下,不爲空)感,這對包括C++在內的許多語言都很常見。從http://www.intap.net/~drw/cpp/cpp03_04.htm,

在C++中,對非布爾變量使用布爾運算符是完全合法的。在C++中,「0」爲假,任何非零值爲真。