Question

I possède une classe avec plusieurs propriétés publiques dont les objets ne sont utilisés dans les différentes parties du système. Le problème est que je dois charger que certaines de ces propriétés publiques dans chaque endroit que je utilise les objets de la classe, parce que le chargement de la liste complète des propriétés à chaque fois que prendrait une éternité.

Est-il possible que je peux utiliser __autoload ou une fonction similaire pour appeler les fonctions charge différentes variables au moment où ils sont appelés?

par exemple.

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
}
Était-ce utile?

La solution

Dans votre code,

  • renommer la fonction magicLoading à __get,
  • ajouter une déclaration de retour dans vos méthodes '' de load...
  • vérifier que les variables ne sont pas encore initialisé.

Et ça marche!

Autres conseils

Toutes mes excuses à mes collègues pour avoir publié ce qui ressemble à une réponse en double, mais ils ont manqué quelque chose.

Pour que les crochets __get() et __set() pour fonctionner correctement, la variable membre en question ne peut pas être déclarée à tous -. Simplement être déclarée mais non définie ne suffit pas

Cela signifie que vous devrez retirer la déclaration de toutes les variables que vous voulez être accessible de cette manière (à savoir le public $Ingredients; etc)

Ergo, votre classe pourrait alors ressembler à ceci.

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

Oui, vous pouvez créer la méthode magique

scroll top