2010-12-01 61 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