2012-08-27 112 views
0

我有一組類保存數據庫的狀態。它就像一個微型ORM模式。因此,對於這個解決方案,我在幾桌動態屬性的類的結構加載,使得類看起來是這樣的:動態創建私有變量?

  • 對象
    • [tbl_name]
      • ATTRIBUTE1
      • attribute2
      • attribute3
    • [tbl_name]
      • ATTRIBUTE1
      • attribute2
      • attribute3

所有的屬性是公共屬性,因爲我有這樣的設置他們:

$object->{$table_name}->{$attribute} = 'foobar'; 

我」什麼d就像這些動態設置的屬性一樣是私人的。爲什麼?因爲,請不要錯過這裏的諷刺,我想通過使用__get()和__set()的重載getter/setter讓它們再次公開。我們再次回到原因的問題。實際上,「獲得」我可以用公共財產罰款,但爲了設置我想在應用設置之前應用一些邏輯。這裏是我簡化的__set()函數,它讓你知道我想要實現什麼:

public function __set ($property , $value) { 

    if (!in_array ($property , $blocked_properties)) { 
     $this->property = $value; 
     $this->trigger_event ($property); 
    } 
} 

有意義嗎?我很高興通過其他方式解決這個問題,但是如果我只能動態地設置私有實例變量,這看起來像是一種非常優雅的方式。

+0

爲什麼不使用「真正的」ORM像教條2? http://www.doctrine-project.org/ –

+0

學習曲線。矯枉過正。靈活性。不知道最後一個,但我有一些想法,我想將我的Enum對象分配給可能不支持ORM的屬性等。 – ken

回答

0

不要讓那些實際屬性,它們存儲在一個private陣列只有通過魔術方法訪問它們:

class ORM { 

    private $fields = array(); 

    public function __get($name) { 
     return $this->fields[$name]; 
    } 

    public function __set($name, $value) { 
     $this->fields[$name] = $value; 
    } 

} 

它的行爲你到底怎麼想的那樣。

+0

好的建議。我已經做了這個,但現在我遇到了一個問題,這是......我想......當我將一個對象分配給其中一個屬性時,我得到一個「未定義的屬性:stdClass :: $ ext_tables」。我的猜測是,任何試圖獲取超出對象圖頂層任何位置的東西的嘗試都將失敗。這聽起來是對的還是我只是沒有看到什麼? – ken