2010-12-01 33 views
2

我有一個包含多個公共屬性的類,其中的對象正在系統的不同部分中使用。問題是我只需要在每個使用類對象的地方加載一些公共屬性,因爲每次加載整個屬性列表都將永遠佔用。如何僅在PHP中需要時加載變量

有沒有什麼辦法可以使用__autoload或類似的函數來調用在調用它們時加載不同變量的函數?

E.g.

class Bread { 
    public 
    $Ingredients, 
    $Price, 
    $Color; 

    public function magicLoading($var) { 
    switch($var) { 
     case "Ingredients" : return loadIngredients(); 
     case "Price"  : return loadPrice(); 
     case "Color"  : return loadColor(); 
     default   : break; 
    } 
    } 

    public function loadIngredients() { 
    $this->Ingredients = ... 
    } 
} 

foreach($Bread->Ingredients as $Ingredient) { 
    //do stuff here 
} 

回答

1

在你的代碼,

  • 重命名功能magicLoading__get
  • 在你的 'load...' 的方法添加一個return語句
  • 檢查變量尚未初始化。

它的工作原理!

0

是的,你可以創建魔術方法__get被稱爲每次類的屬性(即尚未初始化)的讀取時間。

1

向同事道歉,發佈看起來像重複的答案,但他們錯過了一些東西。

爲了使__get()__set()鉤能夠正常運行,在問題成員變量不能在所有聲明 - 簡單地聲明,但不確定是不夠的。

這意味着你必須刪除你想以這種方式(即public $Ingredients;等)

人體工程學,你的類可能再看看這樣的訪問的任何變量的聲明。

class Bread 
{ 
    /* No variable declarations or the magic methods won't execute */ 

    protected function loadIngredients() 
    { 
    $this->Ingredients = ... 
    } 

    public function __get($var) 
    { 
    switch($var) 
    { 
     case "Ingredients" : $this->loadIngredients(); break; 
     case "Price"  : $this->loadPrice(); break; 
     case "Color"  : $this->loadColor(); break; 
     default   : throw new Exception("No case for $var"); 
    } 
    return $this->$var; 
    } 
} 
+1

我認爲值得明確解釋在運行時創建的屬性如何默認爲public,從而繞過未來的`__get()`調用。 (因此,如果你想要一個只讀的懶惰負載,這種方法是不好的,但如果這不是問題,這是一個很好的'技巧') – Matthew 2010-12-01 18:52:01