2011-07-07 16 views
1

我會從一些數據庫執行SELECT查詢並返回一個功能之一:測試變種,可能是陣列/空數組/假

  • false(在錯誤的情況下)
  • 空陣列array(0) { }
  • 關聯數組

爲了測試此函數的返回值,它是很好的做法做:

$someVar = $this->someFunction(); 

if ($someVar) { 
    // ok, this is an associative array of result 
} else { 
    // $someVar = false OR $someVar is an empty array 
} 

還是做我必須做這樣的事情,而不是:

$someVar = $this->someFunction(); 

if (is_array($someVar) && count($someVar) > 0) { 
    // ok, this is an associative array of result 
} else { 
    // $someVar = false OR $someVar is an empty array 
} 

第一個測試,似乎做我想做的,但也許我失去了一些東西,可能以後去錯了。

那麼,像我在第一個例子中那樣,測試數組是否很好?

回答

2

都沒有。

返回false表示在很低的級別上錯誤很好,但是在低級查詢和應用程序代碼之間應該有一層檢查返回值並在false上拋出異常。調用代碼的頂級控制器應該處理那些異常(以前未捕獲)並在生產中顯示用戶友好的錯誤頁面,或者在開發中轉儲調試信息,同時記錄錯誤。

絕對沒有辦法在應用程序中執行三路if/elseif/else分支來檢查每個數據庫查詢的返回值。這是一個令人難以置信的日期檢查錯誤的方式。

拋出異常,你可以使用你的第一種形式(if ($someVar)),或者更好的:

foreach ($this->someFunction() as $key => $row) { 


} 
+0

也許我應該在這裏給出上下文,它將在批處理腳本中用crontab的郵件發送給我的輸出。儘管如此,沒有理由懶惰,我會通過PDO異常來處理錯誤。謝謝你的回答,這真的很有幫助。 –

0

都沒有。測試所有三種情況:

if (false === $result) { 
    die('There is an error!'); 
} elseif (empty($result)) { 
    die('No results found'); 
} 

foreach ($result as $foo) { ... } 

如果你真的想測試只有兩個,那麼請記住,foreach將空數組工作。因此,這將工作:

if (false === $result) { 
    die('There was an error!'); 
} 

foreach ($result as $foo) { ... } 

或者:

if (false === $result) { 
    echo 'There was an error!'; 
} else { 
    foreach ($result as $foo) { ... } 
} 

這最後的例子將簡單地給出一個空白頁時,$結果是一個空數組。第一個例子會說沒有結果。

+0

+1,但讓我改變你的比較,請笑 – dynamic

+0

NVM的順序....... ... – dynamic

+0

@ yes123:這個顛倒的順序是在你意外地只有一個=而不是兩個時防止錯別字。然後它會導致一個解析錯誤,而不是很難找到錯誤。 –

1

http://php.net/manual/en/types.comparisons.php

一個空數組計算結果爲false。一個包含值的數組計算結果爲true(即使所有值都會單獨評估爲false)。

您也可以檢查if (empty($array)),但這樣做是多餘的,除非您擔心未設置數組變量。如果數組爲空,則$array == false爲真,但$array === false不是。

+0

這正是我正在尋找initialy並沒有找到的文檔頁面。 @meagar答案最後是最有用的,但是+1和你以及@AJ –

1

根據類型比較的文檔,您的第一種方法是完全可以接受的。一個空數組總是會計算爲FALSE。

文檔:http://php.net/manual/en/types.comparisons.php

這就是說,你可以選擇沒有處理結果和錯誤的不同,例如將錯誤消息記錄到服務器日誌中。在這種情況下,您可能需要多個if()條件。