2010-12-01 41 views
2

J'ai une classe avec plusieurs propriétés publiques dont les objets sont utilisés dans différentes parties du système. Le problème est que je n'ai besoin de charger que certaines de ces propriétés publiques dans chaque endroit où j'utilise les objets de la classe, car charger la liste complète des propriétés à chaque fois prendrait une éternité.Comment charger des variables uniquement en cas de besoin dans PHP

Est-il possible d'utiliser __autoload ou une fonction similaire pour appeler les fonctions qui chargent différentes variables au moment où elles sont appelées?

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 
} 

Répondre

1

Dans votre code,

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

Et ça marche!

0

Oui, vous pouvez créer la méthode magique __get qui est appelé à chaque fois une propriété (non encore initialisé) de la classe est lu.

1

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

Pour que les crochets pour fonctionner correctement __get() et __set(), la variable membre en question ne peut pas être déclarée à tout - tout 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; 
    } 
} 
+1

Je pense qu'il vaut la peine d'expliquer explicitement comment la propriété créée lors de l'exécution est par défaut publique, et contourne ainsi les futurs appels '__get()'. (Par conséquent, cette méthode n'est pas bonne si vous voulez une charge paresseuse en lecture seule ... mais si ce n'est pas problématique, c'est une bonne astuce à utiliser.) – Matthew

+0

Bon détail, konforce. Il convient de mentionner, bien que Cat les ait déjà définis comme «publics», alors dans ce cas, je ne pense pas que ce soit un problème. –