我想要做的是使用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