0

我正在使用 ORM 类 - 数据库中的每个表都使用 ORM 类的子类表示。

我正在使用 PHP 接口,我希望在我的一些 ORM 子类中指定需要哪些方法(数据库字段)。向接口添加函数需要在类中显式声明该方法。但是,这些方法依赖于魔术方法来实现实际功能,因为在运行时之前 ORM 不知道 DB 结构。

我想象做的是为每个创建函数,这将返回父类的结果。

考虑:

class ORM
{
    // Library code here. Can't change this.

    public function __call($name, $arguments)
    {
        return call_user_func_array(array($this, $method), $arguments);
    }
}

interface MyTableInterface
{
    public function myDbField();
}

class MyTable extends ORM implements MyTableInterface
{
    public function myDbField()
    {
        return parent::myDbField();
    }
}

使用此代码,当我parent::myDbField()MyTable类调用时,它会正确移动到 ORM 类并使用__call魔法方法。到达这里后,$thisequalsMyTable会从类中调用原始函数,MyTable而不是启动它自己的逻辑来从数据库中提取信息。

我怎样才能避免这种递归?

4

2 回答 2

1

一种方法是将 $orm 实例作为 dep (构造函数、setter 或任何逻辑)传递。前任:

class MyTable {
    protected $orm;
    public function __construct(Orm $orm)
    {
        $this->orm = $orm;
    }
    public function myDbField()
    {
        return $this->orm->myDbField();
    }
}

这样,Orm __call 中的 $this 就指向了 Orm 实例。也许,这可能是使用适配器模式的场景?

于 2013-11-14T11:17:30.583 回答
0

call方法仅在没有找到方法时调用,在您的示例中这是不可能的,因为在子类中找到了该方法

于 2013-11-14T09:39:54.190 回答