2009-11-18 37 views
1

我想要做的是使用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方法來創建代理類爲我的模特和所有子類是一個好主意他們?

回答

3

這樣做沒有內在的方法。雖然你可以使用PECL extension called runkit這樣做,但我強烈建議找到另一種解決方案。更改的功能的實現,你可以不知道什麼是非常危險的並在調試一個這樣的錯誤可能比寫所有你的函數if (is_null(...語句需要更長的時間可能會導致錯誤。

順便說一句:不要使用is_null(),因爲您可能會一遍又一遍地從數據庫中提取空值。您應該將提取的值存儲在單獨的變量中。

+0

但是,如果我寫的,如果(is_null(...我通過調用'$這個 - > adapter'耦合與DataAbstractionLayer模型的模型內。另外'is_null'實際上沒有檢查數據庫字段,但檢查屬性它持有相關的實體 – andho 2009-11-18 08:25:29

+1

恰恰相反:如果你要在類的外部實現邏輯*,你可能會違反OO編程規則,你有一個數據庫連接對象(我假設'$ this - > adapter'就是一個),這叫做依賴注入,目前被認爲是很好的做法。 – soulmerge 2009-11-18 08:38:11

+0

關於'is_null()'的問題是調用'$ user-> getFirstName()'兩次會查詢數據庫兩次'users'表的列'firstname'具有'NULL'值。 – soulmerge 2009-11-18 08:39:52

0

看着php.net上的反射doc,在我看來,它是不可能在航班上修改的方法。

你應該嘗試以不同的方式做到這一點。

相關問題