Php 是否可以使用反射修改对象实例的方法
我要做的是用一个普通的老PHP对象创建一个域模型。 我正在创建一个库,它将完成所有基础设施的工作。 我的一个模型是这样的Php 是否可以使用反射修改对象实例的方法,php,reflection,orm,domain-model,Php,Reflection,Orm,Domain Model,我要做的是用一个普通的老PHP对象创建一个域模型。 我正在创建一个库,它将完成所有基础设施的工作。 我的一个模型是这样的 class Project { public $id; public $name; public $typeId; private $type; public function getType() { return $this->type; } public function setType(Type $type) {
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
,并使用ORM保存项目实例,则项目和类型都将保存。但是,然后我加载项目并使用getType
方法,我希望ORM能够透明地修改这个方法,以便从Persience加载对象。所以这里的方法是:
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();
}
Outlet PHP使用eval为项目创建一个名为Project_Proxy的代理类,但有时会有Project的子类,所以如果有办法的话,我正在使用反射API搜索解决方案
我在谷歌上搜索过,但还没有找到改变方法行为的方法
编辑:或者使用Outlet PHP的eval方法为我的模型及其所有子类创建代理类是一个好主意吗?查看PHP.net上的反映,我觉得不可能在飞行中修改方法
你应该试着用不同的方法来做这件事。没有内置的方法。尽管您可以使用,但我强烈建议您找到另一种解决方案。更改您一无所知的函数的实现是非常危险的,可能会导致错误,其中调试单个此类错误可能比为所有函数编写
if(is_null)(…
语句花费更长的时间
顺便说一句:不要使用
is\u null()
,因为您可能会一次又一次地从数据库获取null值。您应该将获取的值存储在单独的变量中。但是如果我写入if(is\u null(…在模型内部,我通过调用$this->adapter
将模型与DataAbstractionLayer耦合起来。is_null
实际上并没有检查数据库字段,而是检查保存相关实体的属性。恰恰相反:如果您要在类之外实现类的逻辑,那么您将违抗OO编程规则。您有一个数据库连接对象(我假设$this->adapter
是一个对象),这被称为依赖项注入,目前被认为是良好的做法。的问题是null()
调用$user->getFirstName()如果users
表的firstname
列具有NULL
值,则tweeps将查询数据库两次。谢谢,然后我将使用依赖项注入。我实际上并没有对属性使用getter和setter,而只是为了获取相关实体。因此,要获取firstname,我将使用$customer->firstname
但要为用户获取street address对象,我需要用户$customer->getAddress()->street