2011-05-26 123 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()的形式调用其他类来检查有效性。

相关问题