如何将在多个方法中找到的方法调用模式转换为更简单的 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
        ));
    }
}