我正在使用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
类中的原始函数,而不是启动它自己的逻辑来从数据库中提取信息。
如何避免这种递归?
答案 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方法,在你的例子中,这是不可能的,因为该方法可以在子类中找到