從我所知,檢查先決條件是一個好習慣。如果一個方法需要一個int值,那麼這是一個很好的解決方案做用是這樣的:爲什麼大框架忽略了先決條件檢查?
public function sum($input1, $input2) {
if (!is_int($input1)) throw new Exception('Input must be a integer');
期待的Zend /笨的源代碼,我沒有看到這樣的檢查往往但是經過。是否有一個原因 ?
從我所知,檢查先決條件是一個好習慣。如果一個方法需要一個int值,那麼這是一個很好的解決方案做用是這樣的:爲什麼大框架忽略了先決條件檢查?
public function sum($input1, $input2) {
if (!is_int($input1)) throw new Exception('Input must be a integer');
期待的Zend /笨的源代碼,我沒有看到這樣的檢查往往但是經過。是否有一個原因 ?
因爲在使用它之前測試每個變量是很困難/低效的。相反,他們只檢查輸入變量 - 在門口檢查訪客,而不是在房子內部。
在使用它們之前,測試至少更重要的變量當然是一種很好的防禦性編程技術,特別是如果輸入來自許多地方。
這有點離題,但我會建議的解決方案是,以測試輸入變量是這樣的:
$username=get('username', 'string');
$a=get('a', 'int');
...
$ _REQUEST和類似不應該直接使用(甚至是可訪問的)。
而且,在做的HTML輸出時,你應該始終使用此:
echo html($username); // replaces '<' with '<' - uses htmlentities
爲了避免SQL注入攻擊可以使用MeekroDB,但是這家飯店非常有限(MySQL只,僅單DB,.. )。它有一個很好的API,但它可以提高安全性,所以我建議您檢查一下。 對於我自己,我已經構建了一個基於PDO的小型數據庫庫,並使用了準備好的語句。因人而異。
這是無價的:檢查門口的訪客,而不是在房子內。 – danidacar 2011-05-30 19:01:13
在任何情況下指定這樣嚴格的先決條件都不是必要的,並且感覺在動態類型語言中沒有用處。
$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()
多次出現,只是爲了避免不必要的例外。
它足以驗證值,當你收到它們,而不是遍及整個應用程序。
說到ZF,我會說他們會盡量減少它,而不是接口和類。你可以看到ZF的許多定義是這樣的:
public function preDispatch(Zend_Request_Http $request)
這是很好的。在需要輸入/字符串的關鍵位置也有一些理智檢查。但大多不是以is_string()
的形式,而是以isValidLocale()
的形式調用其他類來檢查有效性。
沒有真正的想法,但它可能是一個效率的事情。 – soandos 2011-05-26 05:06:27
我不同意你提到的框架的核心缺乏先決條件。當我查看CodeIgniter內核時,我看到了很多。 你認爲他們應該在哪裏沒有看到先決條件?這可能會導致更好的討論。 – 2011-05-26 05:13:12
動態語言,鴨子打字,優化。這種事情並不真正表現爲一個問題,在大多數情況下似乎更像是一種過度複雜化。 – dqhendricks 2011-05-26 05:14:56