Как загружать переменные только при необходимости в PHP - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть класс с несколькими открытыми свойствами, чьи объекты используются в разных частях системы.Проблема в том, что мне нужно загружать только некоторые из этих открытых свойств в каждом месте, где я использую объекты класса, потому что загрузка всего списка свойств каждый раз будет длиться вечно.

Есть ли способЯ могу использовать __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
}

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Приношу извинения моим коллегам за публикацию того, что выглядит как дубликат ответа, но они что-то упустили.

Для правильного функционирования хуков __get() и __set() рассматриваемая переменная-член вообще не может быть объявлена ​​ - просто она объявлена, но undefined недостаточен.

Это означает, что вам придется удалить объявление любых переменных, которые вы хотите сделать доступными, таким образом (т. Е. 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 голос
/ 01 декабря 2010

В вашем коде

  • переименуйте функцию magicLoading в __get,
  • добавить оператор возврата в ваши методы load... 1009 *
  • проверьте, что переменные еще не инициализированы.

И это работает!

0 голосов
/ 01 декабря 2010

Да, вы можете создать магический метод __ get , который вызывается каждый раз, когда читается свойство (еще не инициализированное) класса.

...