// der php hacker

// archiv

It’s magic: Magische Methoden in PHP

Geschrieben am 20. Apr 2009 von Cem Derin

In den ersten zwei Teilen meiner Miniserie über die magischen Eigenschaften von PHP bin ich auf die magischen Konstanten und magischen Funktionen eingagangen. Im dritte und letzten Teil werde ich die magischen Methoden behandeln, die mit Abstand die Umfangreichste implementierung von “Zauberei” in PHP darstellen.

__call($method, array $arguments)

Diese Methode innerhalb einer Klasse bewirkt dass Methodenaufrufe auf nicht deklarierte Methoden innerhalb der Klasse an diese magische Methode weitergeleitet werden. Im Parameter $method befindet sich der Name der aufgerufenen Methode, während sich im Array $arguments die übergebenen Parameter befinden. Diese Methode wird auch bei Methodenaufrufen innerhalb der Klasse getriggert.

Mit dieser Methode ist es beispielsweise möglich dynamische Klassen zu verwenden.

__callStatic($method, array $arguments)

Diese Methode bewirkt das selbe wie __call, mit dem kleinen aber feinen Unterschied, dass sie bei statisch aufgerufenen Methoden getriggert wird. Dahingehend muss sie auch als statisch deklariert werden.

__clone

Diese Methode wird aufgerufen, bevor ein Objekt geklont wird. Eingesetzt wird das in der Praxis für diverser Aufräumarbeiten, denn nicht immer soll jede Eigenschaft mit in den Klon übernommen werden.

__construct

Diese Methode wird beim erstellen eines Objektes aufgerufen und löst somit die Methode die gleichnamig mit der dazugehörenden Klasse ist. PHP ist an dieser Stelle allerdings abwärtskompatibel. Von einer Vermischung wird trotzdem abgeraten. Es ist übrigens nicht zwingend nötig, einen Konstruktor zu definieren.

__destruct

Das Equivalent zu __construct. Diese Methode wird getriggert, wenn das Objekt vernichtet wird (sei es durch die Garbage Collection oder durch manuelles auflösen des Objektes). Hier kann beispielsweise noch einmal geprüft werden, ob Daten noch gesichert werden müssen. Es ist allerdings nicht möglich, das auflösen des Objektes zu verhindern.

__get($name)

Diese Methode wird aufgerufen, wenn versucht wird, auf ein Property eines Objektes zuzugreifen, dass nicht gesetzt oder nicht öffentlich zugänglich ist. Im Parameter $name befindet sich in diesem Fall der Name des Propertys.

Innerhalb eines Objektes wird diese Methode nur aufgerufen, wenn versucht wird auf ein nicht existierendes oder privates Property der Elternklasse zuzugreifen.

__invoke

Wird aufgerufen, wenn eine Objektinstanz wie eine Funktion aufgerufen wird.

__isset($name)

Wir aufgerufen, wenn versucht wird zu prüfen, ob ein nicht vorhandenes oder nicht verfügbares Property gesetzt ist.

__set($name, $value)

Wird aufgerufen wenn versucht wird, nicht verfügbare Propertys zu setzen. Dabei enthält $name den Namen des Propertys und $value den entsprechenden Inhalt. __set spielt hier natürlich gut mit __get zusammen.

__set_state(array $array)

Wird aufgerufen, wenn versucht wird, var_export auf das Objekt anzuwenden. Muss validen PHP-Code zurückgeben. Als einziger Parameter wird ein Array mit den Werten übergeben, die exportiert worden wären, wäre diese magische Methode nicht definiert. Hier kann also noch ein letztes mal gefiltert werden.

__set_state muss darüber hinaus statisch sein.

__sleep

Wird aufgerufen, wenn das Objekt serialisiert wird. Hier können nicht benötigte Propertys verworfen werden, wie zum Beispiel Datenbankverbindungen oder Dateizeiger.

Wird null bzw. gar nichts zurückgegeben, gibt PHP eine Notice aus.

__toString

Wird aufgerufen, wenn versucht wird, das Objekt direkt auszugeben. Diese Methode sollte einen String zurückgeben.

__unset($name)

Wird aufgerufen, wenn versucht wird, nicht verfügbare Propertys aufzulösen. Im Parameter $name befindet sich in dem Fall der Name des Propertys, auf das versucht wurde zuzugreifen.

__wakeup

Equivalent zu __sleep wird diese Methode aufgerufen, wenn ein Objekt deserialisiert also wieder hergestellt wird. Hier können nicht serialisierbare Ressourcen wieder hergestellt werden.


#001
21. Apr 2009
PHP-Desaster

Die Erklärung zu __set_state ist nicht ganz korrekt. Der Export von var_export erstellt zu einer Instanz einer Klasse ein Konstrukt a la
MyClass::__set_state(array(/*Properties*/));
also nicht für den Export, sondern den Import wird diese Methode verwendet.


#002
21. Apr 2009
unset

Stimmt, da hab ich gestern wohl Mist zusammengeschrieben. Wir lernen daraus, dass man nicht gleichzeitig telefonieren und einen Artikel verfassen sollte ohne ihn gegenzulesen ;-)

Ich korrigiere das heute Abend mal.

#003
19. Aug 2009

[...] dazu mal was gebloggt: It’s magic: Magische Methoden in PHP | Der PHP Hacker — Noch ein PHP Blog __________________ There’s no business like codebusiness who we are! (17 profiles and [...]

// kommentieren

// senden
theme von mir, software von wordpress, grid von 960 grid system. funktioniert in allen browsern, aber der safari bekommt das mit der schrift am schönsten hin.