从我所知,检查先决条件是一个好习惯。如果一个方法需要一个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