OOP in PHP – Teil 6: Magische Methoden

Trotz des mystischen Titels hat dieser Artikel leider wenig mit Harry Potter oder Merlin dem Zauberer zu tun. Magische Methoden in PHP erweitern unseren Code um eine gehörige Portion Dynamik und Erweiterbarkeit – richtige Implementation vorausgesetzt natürlich. Genau um diese kümmern wir uns nun ausgiebig.

Magische Methoden im OOP

Die erste Besonderheit der magischen Methoden sind die beiden Unterstriche (_) die den Methodennamen vorgestellt sind. Alle Namen sind reserviert, man kann die Namen also nicht für eigene Funktionalitäten verwenden.

__construct() und __destruct()

Die ersten beiden magischen Methoden beziehen sich auf das Erstellen beziehungsweise Löschen von Objekten. Die Methoden sind optional, das heißt falls wir sie nicht implementieren stört PHP das überhaupt nicht. Sind sie jedoch vorhanden werden sie automatisch aufgerufen.

__construct() wird immer dann aufgerufen, wenn ein Objekt mithilfe des new Operators erstellt wird. Hier kann man zum Beispiel Initialisierungen von Variablen oder ähnliches vornehmen. Legen wir Parameter im sogenannten Konstruktor fest müssen diese bei der Instanzierung übergeben werden. Ein Beispiel folgt nach der Beschreibung für den Destruktor __destruct().

__destruct() wird aufgerufen, sobald ein Objekt von PHPs Garbage Collector gelöscht wird. Dies passiert immer sobald keine Referenz mehr auf das Objekt vorhanden sind. Gerade in umfangreicheren Programmen kann dies auch zu unvorhergesehenen Umständen führen. Daher empfehle ich, keine wichtigen Codebestandteile in diese Methode zu packen.

Wir sehen, unsere magischen Methoden werden ausgeführt obwohl wir sie nie ausdrücklich aufrufen. Außerdem werden die Parameter, die wir im Konstruktor festgelegt haben, beim Aufruf des new Operators mit übergeben. Der Klassenname ist also quasi ein Alias für den Konstruktor.

__get() und __set()

Genau wie Konstruktor und Destruktor sind diese beiden magischen Methoden gegenteilig zueinander.

__get() wird aufgerufen falls wir versuchen, den Wert eines Attributs abzurufen, das es nicht gibt. Die Methode erhält den Namen der Variablen als Parameter, was wir mit dieser Information anstellen liegt ganz bei uns. Ein Beispiel wäre, unbekannte Attribute innerhalb eines Arrays abzuspeichern. Bei vielen benötigten verschiedenen Attributen kann uns das viel Arbeit ersparen, führt aber auch zu einer schlechteren Lesbarkeit des Codes. Es sollte also vorsichtig mit dieser Möglichkeit umgegangen werden.

__set() ist das Gegenteil von __get() und wird automatisch aufgerufen, wenn wir versuchen, den Wert eines Attributs zu setzen, das nicht definiert ist.  Ist die jeweilige magische Methode nicht definiert würde ein Fehler geworfen werden, wenn wir das versuchen. Schauen wir uns das oben erwähnte Beispiel einmal an.

Wie wir sehen gibt es nur ein einziges Attribut in unserer Beispielklasse: attribute. Dieses stellt ein Array dar, in welchem die Werte gespeichert werden. Der Attributname ist dabei der Key unter welchem __set() die Werte speichert. Dadurch können wir mit __get() die jeweiligen Werte wieder abrufen und verwenden. Das sieht auf den ersten Blick nach sehr viel Arbeitsersparnis aus, birgt aber viele mögliche Fehlerquellen und unlesbaren Code.

__call() und __callStatic()

Was __get() und __set() für Attribute sind bieten __call() und __callStatic() uns im Umfeld der Methoden. Versuchen wir, eine Methode aufzurufen, die nicht definiert ist, werden diese – falls definiert – aufgerufen. Ist es die Methode eines Objekts wird __call() aufgerufen, im statischen Kontext __callStatic() (den statischen Kontext besprechen wir bald ausführlich in einem eigenen Artikel). Als Parameter erhalten wir hier sowohl den Namen der aufgerufenen Methode als auch die übergebenen Parameter in einem Array. Schauen wir uns das ganze als Beispiel an.

 

Dieses Beispiel erzeugt die Ausgabe Funktion beispiel wurde mit 3 Parametern aufgerufen. Auch diese magische Methode gibt uns die Möglichkeit für viel Dynamik auf die wir damit reagieren können. Planen wir eine Veröffentlichung unserer Klassen um sie anderen zur Verfügung zu stellen können wir damit potenziellen Benutzern extrem viel Funktionalität zur Verfügung stellen.

2 Kommentare zu “OOP in PHP – Teil 6: Magische Methoden

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*