2011-05-26 80 views
4

從我所知,檢查先決條件是一個好習慣。如果一個方法需要一個int值,那麼這是一個很好的解決方案做用是這樣的:爲什麼大框架忽略了先決條件檢查?

public function sum($input1, $input2) { 
if (!is_int($input1)) throw new Exception('Input must be a integer'); 

期待的Zend /笨的源代碼,我沒有看到這樣的檢查往往但是經過。是否有一個原因 ?

+2

沒有真正的想法,但它可能是一個效率的事情。 – soandos 2011-05-26 05:06:27

+1

我不同意你提到的框架的核心缺乏先決條件。當我查看CodeIgniter內核時,我看到了很多。 你認爲他們應該在哪裏沒有看到先決條件?這可能會導致更好的討論。 – 2011-05-26 05:13:12

+2

動態語言,鴨子打字,優化。這種事情並不真正表現爲一個問題,在大多數情況下似乎更像是一種過度複雜化。 – dqhendricks 2011-05-26 05:14:56

回答

3

因爲在使用它之前測試每個變量是很困難/低效的。相反,他們只檢查輸入變量 - 在門口檢查訪客,而不是在房子內部。

在使用它們之前,測試至少更重要的變量當然是一種很好的防禦性編程技術,特別是如果輸入來自許多地方。

這有點離題,但我會建議的解決方案是,以測試輸入變量是這樣的:

$username=get('username', 'string'); 
$a=get('a', 'int'); 
... 

$ _REQUEST和類似不應該直接使用(甚至是可訪問的)。

而且,在做的HTML輸出時,你應該始終使用此:

echo html($username); // replaces '<' with '&lt;' - uses htmlentities 

爲了避免SQL注入攻擊可以使用MeekroDB,但是這家飯店非常有限(MySQL只,僅單DB,.. )。它有一個很好的API,但它可以提高安全性,所以我建議您檢查一下。 對於我自己,我已經構建了一個基於PDO的小型數據庫庫,並使用了準備好的語句。因人而異。

+1

這是無價的:檢查門口的訪客,而不是在房子內。 – danidacar 2011-05-30 19:01:13

2

在任何情況下指定這樣嚴格的先決條件都不是必要的,並且感覺在動態類型語言中沒有用處。

$sum = sum("1", "2"); 

爲什麼要禁止它?另外如果你拋出異常,則試圖避免它。這意味着,他將測試並自詡爲

function sum ($a, $b) { 
    if (!is_int($a)) throw new Exception('Input must be a integer'); 
    if (!is_int($b)) throw new Exception('Input must be a integer'); 
    return $a + $b; 
} 

if (!is_int($value1)) { $value1 = (int) $value1; } 
if (!is_int($value2)) { $value2 = (int) $value2; } 
$sum = sum($value1, $value2); 

is_int()多次出現,只是爲了避免不必要的例外。

它足以驗證值,當你收到它們,而不是遍及整個應用程序。

0

說到ZF,我會說他們會盡量減少它,而不是接口和類。你可以看到ZF的許多定義是這樣的:

public function preDispatch(Zend_Request_Http $request) 

這是很好的。在需要輸入/字符串的關鍵位置也有一些理智檢查。但大多不是以is_string()的形式,而是以isValidLocale()的形式調用其他類來檢查有效性。