Wie erfolgt die Belastungsgrößen nur bei Bedarf in PHP
-
29-09-2019 - |
Frage
habe ich eine Klasse mit mehreren öffentlichen Eigenschaften, deren Objekte sind in verschiedenen Teilen des Systems verwendet werden. Das Problem ist, dass ich nur an jedem Ort einige dieser öffentlichen Eigenschaften laden muss ich die Objekte der Klasse bin mit, weil die gesamte Liste der Eigenschaften Laden für immer jedes Mal würde.
Gibt es eine Möglichkeit, __autoload
oder eine ähnliche Funktion verwenden kann, um die Funktionen zu nennen, dass Last verschiedene Variablen zu der Zeit sie genannt werden?
z.
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
}
Lösung
In Ihrem Code,
- benennen Sie die Funktion
magicLoading
zu__get
, - fügen Sie eine return-Anweisung in Ihren
load...
'Methoden - Überprüfen Sie, dass die Variablen noch nicht initialisiert wurde.
Und es funktioniert!
Andere Tipps
Entschuldigt meinen Kollegen für die Buchung, was aussieht wie eine doppelte Antwort, aber sie etwas verpasst haben.
Damit der __get()
und __set()
Haken Funktion die Membervariable in Frage richtig, kann überhaupt nicht deklariert werden -. Einfach erklärt werden, aber nicht definiert ist nicht ausreichend
Das heißt, Sie werden die Deklaration aller Variablen entfernen müssen Sie auf diese Weise zugänglich sein soll (das heißt die public $Ingredients;
usw.)
Ergo, Ihre Klasse könnte dann so aussehen.
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;
}
}