如何仅在PHP需要时加载变量

时间:2010-12-01 18:27:26

标签: php autoload lazy-evaluation lazy-initialization

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

有什么方法可以使用__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
}

3 个答案:

答案 0 :(得分: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 :(得分:1)

在您的代码中,

  • 将函数magicLoading重命名为__get
  • 在“load...”方法
  • 中添加一个return语句
  • 检查变量是否尚未初始化。

它有效!

答案 2 :(得分:0)

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