2011-05-21 54 views
3

在創建類,我也跟着OO公約和使用它們之前聲明的所有類變量:在PHP中創建動態類變量是個好主意嗎?

class myClass { 
     private $property1, $property2, ...; 

     public __constructor() { 
     $this->property1 = $this->property2 = NULL; 
     } 

    } 

但我意識到PHP是腳本語言,而不是下面的面向對象的概念嚴格,所以我們可以動態'產生階級屬性:

class myClass { 
     public __constructor() { 
     $this->fields = $this->db->getFields(TABLE_NAME); 

     foreach($this->fields as $fld) { 
      $this->{$fld} = NULL; 
     } 
     } 

    } 

這是一個好方法嗎? 我認爲動態生成的屬性默認情況下具有公共訪問權限,所以這可能是一個缺點,並且這種自動化可能是一個優點。 性能方面有什麼不同嗎?

+0

可能重複[爲什麼在PHP中隱含的財產申報?](http://stackoverflow.com/questions/6027861/why-implicit-property -declaration-in-php) – 2011-05-21 07:47:12

回答

4

你不鼓勵這樣做,但在某些情況下,你只需要(就像你在編寫ORM一樣)。類應該有清晰的接口(程序員需要知道他可以怎樣處理你的類)。

但有處理這些情況下(至少,對我來說似乎更好)一個更好的辦法。在你的類中準備一個關聯的數據數組,並使用__get方法。 ORM可能更好(可以實現延遲加載等)。

+1

'但是在某些情況下,你只需要(就像在ORM中一樣) - 它絕對是愚蠢的ORM,你需要這樣做,並且這個特性是爲怪物創建的,__get和__set看起來像屬性實現從C#,並且可能是非常有用的,但也不能在界面中(PHP)的說明。 – 2011-05-21 09:00:50

+0

確定,但我認爲,如果我們想給在構造函數中的所有屬性,__get和__set方法而言非常昂貴。時間 – 2011-06-04 12:48:44

+0

都能跟得上看看這個:https://gist.github.com/1007883 – 2011-06-04 13:03:12

1

這取決於你的情況。當你有直接映射到表(或其他結構)的數據容器時,這是一種常見的做法。在ORM中最常用,因爲列是在運行時確定的,並且不需要爲每個表定義容器類。

2

如果您正在編寫許多用戶應該使用的代碼(庫),那麼最好嚴格定義您的API。這樣在實施時就不會出現混亂。但如果您將它用於單個案例,它不會那麼糟糕,實際上它可以提供很大的靈活性。

1

這一切都取決於你想如何使用這些公開的變量。例如在像Symfony這樣的框架中就可以很好地使用它們。所有動態類變量都可以在模板等類的外部使用。

因此,它可以是一個很好的做法,如果你有創意與他們的

相關問題