通常,所有理智的开发人员都试图保护所有公共方法的输入(转换为正确的类型、验证、消毒等)。
我的问题是:您是否在代码中还验证了传递给受保护/私有方法的参数?在我看来,这并不是必要的,如果您正确地保护了公共方法的参数和外部返回值(其他类、数据库、用户输入等...)。
但我经常遇到框架和应用程序(例如prestashop),其中方法调用、方法体中经常重复验证,并再次对返回值进行保护——我认为这会导致性能损失,并且也是糟糕设计的标志。
通常,所有理智的开发人员都试图保护所有公共方法的输入(转换为正确的类型、验证、消毒等)。
我的问题是:您是否在代码中还验证了传递给受保护/私有方法的参数?在我看来,这并不是必要的,如果您正确地保护了公共方法的参数和外部返回值(其他类、数据库、用户输入等...)。
但我经常遇到框架和应用程序(例如prestashop),其中方法调用、方法体中经常重复验证,并再次对返回值进行保护——我认为这会导致性能损失,并且也是糟糕设计的标志。
对于受保护的方法,我认为应该进行验证,因为该方法可能会被覆盖或从其他类中调用,您不能假设该方法的输入有效。如果这是将由其他应用程序使用的组件,则尤其如此。
对于私有方法,我认为这是一种浪费,因为您控制着传递给方法的数据,因此在调用私有方法之前应该对数据进行验证。
class A {
protected final function myMethodDefaultImplementation(...) {
/* subclasses can just call this method in their myMethod implementations */
/* should do validation */
...
}
protected abstract myMethod(...);
public function orderByDate() {
return $this->orderBy(ORDER_BY_DATE)
}
private function orderBy($crit) {
/* should do validation */
...
}
}
确切地说,如果您的应用程序设计得好,那么这是不必要的。
只在最后一刻清理输入。我不认为面向对象语义会有任何不同。
例如,如果由于某种原因你不能使用参数化查询或ORM(目前我能想到的唯一一个例子 :),你可以像这样编写函数:
function getname($id) {
$id = intval($id);
mysql_query("SELECT * FROM users WHERE id = $id");
...
}
现在任何代码都无法调用此函数并导致意外结果。