__get

Aggregiert ein Objekt ein anderes, so wird das aggregierte Objekt häufig im Konstruktor erzeugt und in der entsprechenden Instanzvariablen abgelegt (Beispiel 2.2). Auf diese Weise steht das aggregierte Objekt für den gesamten Lebenszyklus des aggregierenden Objektes zur Verfügung und kann beispielsweise von dessen Methoden genutzt werden.

Beispiel 2.2: Die Klasse ExpensiveInitialization

<?php
require_once 'SomeClass.php';
 
class ExpensiveInitialization {
  private $aggregatedObject;
 
  public function __construct() {
    $this->aggregatedObject = new SomeClass;
  }
}
?>


Für den Fall, dass die Methoden des aggregierenden Objektes eher selten auf das aggregierte Objekt für die Ausführung ihrer Aufgaben zugreifen müssen, kann das oben beschriebene Verfahren eher ungeeignet sein. Ist die Erzeugung des aggregierten Objektes teuer, was beispielsweise bei der Kapselung von Ressourcen wie Datenbankverbindungen durch das aggregierte Objekt der Fall ist, ist es sinnvoll, das aggregierte Objekt erst bei seiner ersten Verwendung zu erzeugen. Dieses Konzept wird Lazy Initialization genannt und kann beispielsweise mit der Interzeptormethode __get($memberName) (Beispiel 2.3) implementiert werden.

Beispiel 2.3: Die Klasse LazyInitialization

<?php
require_once 'SomeClass.php';
 
class LazyInitialization {
  public function __get($memberName) {
    if ($memberName == 'aggregatedObject') {
      $this->aggregatedObject = new SomeClass;
 
      return $this->aggregatedObject;
    }
  }
}
?>