PHP:从同名函数调用父魔法

时间:2013-11-14 09:36:13

标签: php

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

我正在使用PHP接口,我希望指定一些ORM子类中需要哪些方法(db字段)。向接口添加函数需要在类中显式声明该方法。但是,这些方法依赖于魔术方法来实现实际功能,因为在运行时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魔术方法。到达此处后,$this等于MyTable,它会调用MyTable类中的原始函数,而不是启动它自己的逻辑来从数据库中提取信息。

如何避免这种递归?

2 个答案:

答案 0 :(得分: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实例。也许,这可能是使用适配器模式的场景?

答案 1 :(得分:0)

只有在没有找到方法的情况下才会调用

call方法,在你的例子中,这是不可能的,因为该方法可以在子类中找到