如何将在多个方法中找到的方法调用模式转换为更简单的 OO 机制?
How to transform a method call pattern found in multiple methods into a simpler OO mechanism?
在我的 class 中,我有很多函数可以简单地将代码重定向到 DAO class(一个 class 从数据库中的数据形成业务对象)。
有没有办法创建一个函数来替换下面的所有函数?
public function getIdFromModel($model)
{
return $this->motorDao->getIdFromModel($model);
}
public function getFrames($a, $b, $c)
{
return $this->motorDao->getFrames($a, $b, $c);
}
public function getManufacturers()
{
return $this->motorDao->getManufacturers();
}
执行此操作的机制是什么以及如何使用它?
您可以通过实施 magic method __call()
.
来做到这一点
但是,我强烈建议不要这样做。使用魔术方法要慢得多,而且 IDE 更难显示代码洞察信息。
此外,您仍然会得到 几乎 一样多的代码,除非您甚至不检查方法名称就传递所有内容。但如果你这样做,你就没有任何验证,任何人都可以调用 DAO 对象的任何方法。那么问题是,为什么你首先要在中间放置这个对象?
您可以为此使用 magic method __call()
:
public function __call($fname, $args) {
call_user_func_array(array($this->motorDao, $fname), $args);
}
如果您只想将一组已定义的函数重定向到 motorDao
,请使用白名单:
public function __call($fname, $args) {
if(in_array($fname, array(
'functionA',
'functionB',
'...'
))) {
call_user_func_array(array($this->motorDao, $fname), $args);
} else {
throw Exception(sprintf("%s has no method %s",
get_class($this), $fname
));
}
}
在我的 class 中,我有很多函数可以简单地将代码重定向到 DAO class(一个 class 从数据库中的数据形成业务对象)。
有没有办法创建一个函数来替换下面的所有函数?
public function getIdFromModel($model)
{
return $this->motorDao->getIdFromModel($model);
}
public function getFrames($a, $b, $c)
{
return $this->motorDao->getFrames($a, $b, $c);
}
public function getManufacturers()
{
return $this->motorDao->getManufacturers();
}
执行此操作的机制是什么以及如何使用它?
您可以通过实施 magic method __call()
.
但是,我强烈建议不要这样做。使用魔术方法要慢得多,而且 IDE 更难显示代码洞察信息。
此外,您仍然会得到 几乎 一样多的代码,除非您甚至不检查方法名称就传递所有内容。但如果你这样做,你就没有任何验证,任何人都可以调用 DAO 对象的任何方法。那么问题是,为什么你首先要在中间放置这个对象?
您可以为此使用 magic method __call()
:
public function __call($fname, $args) {
call_user_func_array(array($this->motorDao, $fname), $args);
}
如果您只想将一组已定义的函数重定向到 motorDao
,请使用白名单:
public function __call($fname, $args) {
if(in_array($fname, array(
'functionA',
'functionB',
'...'
))) {
call_user_func_array(array($this->motorDao, $fname), $args);
} else {
throw Exception(sprintf("%s has no method %s",
get_class($this), $fname
));
}
}