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
}
War es hilfreich?

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

Ja, können Sie die magische Methode erstellen

scroll top