如何将多个方法中找到的方法调用模式转换为更简单的OO机制?

时间:2015-06-12 14:02:58

标签: php oop magic-methods facade

在我的课程中,我有很多函数只需将代码重定向到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();
}

执行此操作的机制是什么以及如何使用?

2 个答案:

答案 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
        ));
    }
}