Comment les variables de charge uniquement en cas de besoin en PHP
-
29-09-2019 - |
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
}
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;
}
}