是否有可能修改使用反射的对象实例的方法
-
20-09-2019 - |
题
我想要做的就是创建一个普通老式PHP对象域模型。 在我创建一个库,它会做所有的基础设施的东西。 所以,我的车型之一看起来像这样
class Project {
public $id;
public $name;
public $typeId;
private $type;
public function getType() {
return $this->type;
}
public function setType(Type $type) {
$this->typeId = $type->id;
$this->type = $type;
}
}
现在,如果创建一个新的项目,并呼吁setType
一个有效的Type对象,并同时使用项目和类型的保存ORM保存项目实例。但后来我加载的项目及使用方法getType
我想要的ORM已经修改了该方法透明地从persitence加载对象。因此这种方法在这里:
public function getType() {
return $this->type;
}
要被透明地改变为:
public function getType() {
if (is_null($this->type) {
$this->type = $this->adapter->findById('table', $this->typeId);
}
return $this->type; // or return parent::getType();
}
直销PHP使用eval创建一个名为Project_Proxy项目的代理类,但有时会出现项目的子类,所以我通过使用反射API,如果有一种方法,寻找解决的办法。
我有搜索谷歌,但还没有发现无论如何改变方法行为
编辑:或它是使用PHP出口的eval方法来创建我的模型代理类一个好主意,他们的子类
解决方案
有是这样做的没有内建的方法。虽然你可以做到这一点使用 PECL扩展名为runkit ,我会强烈建议寻求另一种解决方案。更改的功能的实现,你可以不知道的任何的大约是非常危险的,在那里调试一个这样的错误可能比写为if (is_null(...
语句需要更长的时间可能会导致错误的所有的您的功能。
BTW:不要使用is_null()
,因为你可能会从数据库中一遍又一遍取空值。应该取出的值存储在一个单独的变量。
其他提示
综观反射上php.net DOC 时,它似乎我是不可能在飞机上的方法修改。
您应该尝试做它用不同的方式。
不隶属于 StackOverflow