我想要做的是使用Plain Old PHP Object创建一个域模型。 我正在创建一个库,它将完成所有的基础设施。 所以我的车型之一看起来像这样是否有可能使用反射修改对象实例的方法
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透明地修改此方法以从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但有时会出现项目的子类,所以我搜索如果有方法使用Reflection API解决方案。
我搜索谷歌,但没有发现无论如何改变方法的行为
编辑:,或者是使用插座PHP的eval方法来创建代理类为我的模特和所有子类是一个好主意他们?
但是,如果我写的,如果(is_null(...我通过调用'$这个 - > adapter'耦合与DataAbstractionLayer模型的模型内。另外'is_null'实际上没有检查数据库字段,但检查属性它持有相关的实体 – andho 2009-11-18 08:25:29
恰恰相反:如果你要在类的外部实现逻辑*,你可能会违反OO编程规则,你有一个数据库连接对象(我假设'$ this - > adapter'就是一个),这叫做依赖注入,目前被认为是很好的做法。 – soulmerge 2009-11-18 08:38:11
关于'is_null()'的问题是调用'$ user-> getFirstName()'两次会查询数据库两次'users'表的列'firstname'具有'NULL'值。 – soulmerge 2009-11-18 08:39:52