在我的课程中,我有很多函数只需将代码重定向到DAO类(一个从数据库中的数据形成业务对象的类)。
有没有办法可以创建一个替换下面所有函数的单个函数?
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();
}
执行此操作的机制是什么以及如何使用?
答案 0 :(得分:1)
您可以通过实施magic method __call()
来实现这一目标。
但是,我强烈建议不要这样做。使用魔术方法要慢得多,并且IDE更难以显示代码洞察信息。
此外,你仍然可以使用几乎尽可能多的代码,除非你在没有检查方法名称的情况下传递所有内容。但是如果你这样做,你就没有任何验证,任何人都可以调用DAO对象的任何方法。那么问题是,为什么你首先要把这个对象放在中间?
答案 1 :(得分:1)
您可以使用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
));
}
}