2

我有一个具有多个公共属性的类,其对象正在系统的不同部分使用。问题是我只需要在使用类的对象的每个地方加载其中的一些公共属性,因为每次加载整个属性列表都需要很长时间。

有什么方法可以使用__autoload或类似的函数来调用在调用时加载不同变量的函数?

例如

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
}
4

3 回答 3

1

向我的同事道歉,因为他们发布了看似重复的答案,但他们错过了一些东西。

为了使__get()and__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;
  }
}
于 2010-12-01T18:45:22.100 回答
1

在您的代码中,

  • 将函数重命名magicLoading__get,
  • load...在您的 ' ' 方法中添加一个 return 语句
  • 检查变量是否尚未初始化。

它有效!

于 2010-12-01T18:46:03.530 回答
0

是的,您可以创建每次读取类的属性(尚未初始化)时调用的魔术方法__get 。

于 2010-12-01T18:29:59.480 回答