Pregunta

Tengo una clase con múltiples propiedades públicas cuyos objetos se están utilizando en diferentes partes del sistema. El problema es que necesito cargar sólo algunas de esas propiedades públicas en cada lugar en el que estoy usando los objetos de la clase, ya que la carga de toda la lista de propiedades cada vez que tomaría para siempre.

¿Hay alguna manera de poder utilizar __autoload o una función similar a llamar a las funciones que se cargan diferentes variables en el momento que se llaman?

por ejemplo.

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
}
¿Fue útil?

Solución

En su código,

  • cambiar el nombre de la función para magicLoading __get,
  • añadir una instrucción de retorno en sus métodos '' load...
  • Compruebe que las variables no se han inicializado todavía.

Y funciona!

Otros consejos

Disculpas a mis colegas para publicar lo que parece ser una respuesta duplicado, pero han perdido algo.

Para que los ganchos __get() y __set() para funcionar correctamente, la variable miembro de que se trate no puede declararse en absoluto -. Simplemente ser declarado indefinido, pero no es suficiente

Esto significa que usted tiene que quitar la declaración de las variables que desea ser accesibles de esta manera (es decir, la public $Ingredients; etc)

Ergo, su clase, entonces podría tener este aspecto.

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

Sí, puede crear el método mágico __ get que se llama cada vez que una propiedad (que aún no se ha inicializado) de la clase se lee.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top