PHP Handbuch
Zurück | Kapitel 19. Klassen und Objekte (PHP 5) | Weiter

# Überladung

Sowohl Methodenaufrufe als auch Zugriffe auf Member können mittels der __call, __get und __set Methoden überladen werden. Diese Methoden werden nur ausgelöst, wenn Ihr Objekt oder abgeleitetes Objekt den Member oder die Methode, auf die Sie zuzugreifen versuchen, nicht enthält. Keine Überladungsmethode darf statisch definiert sein. Alle Überladungsmethoden müssen als public definiert sein.

Seit PHP 5.1.0 ist es ebenfalls möglich, die Funktionen isset() und unset() mittels der jeweiligen Methoden __isset und __unset zu überladen.

## Member überladen

void __set ( string name, mixed value )
mixed __get ( string name )
bool __isset ( string name )
void __unset ( string name )

Klassenmember können überladen werden, um eigenen in Ihrer Klasse definierten Code auszuführen, indem man diese speziell benannten Methoden definiert. Der Parameter `$name` ist der Name der Variablen, die gesetzt oder zurückgeliefert werden soll. Der Parameter `$value` der __set() Methode spezifiziert den Wert, den das Objekt der Variable `$name` zuweisen soll.

Beispiel 19-20. Beispiel für Überladung mit __get(), __set(), __isset() und __unset()
`<?php class Setter { public $n; private $x = array("a" => 1, "b" => 2, "c" => 3); public function __get($nm) { echo "Liefere [$nm]\n"; if (isset($this->x[$nm])) { $r = $this->x[$nm]; echo "Gebe zurück: $r\n"; return $r; } else { echo "Nichts!\n"; } } public function __set($nm, $val) { print "Setze [$nm] auf $val\n"; if (isset($this->x[$nm])) { $this->x[$nm] = $val; echo "OK!\n"; } else { echo "Nicht OK!\n"; } } public function __isset($nm) { echo "Prüfe, ob $nm gesetzt ist\n"; return isset($this->x[$nm]); } public function __unset($nm) { echo "Lösche $nm\n"; unset($this->x[$nm]); } } $foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++; var_dump(isset($foo->a)); //true unset($foo->a); var_dump(isset($foo->a)); //false // Dies wird nicht an die Methode __isset() übergeben, // weil 'n' eine public Eigenschaft ist var_dump(isset($foo->n)); var_dump($foo); ?>`
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
`Setze [a] auf 100 OK! Liefere [a] Gebe zurück: 100 Setze [a] auf 101 OK! Liefere [z] Nichts! Setze [z] auf 1 Nicht OK! Prüfe, ob a gesetzt ist bool(true) Lösche a Prüfe, ob a gesetzt ist bool(false) bool(true) object(Setter)#1 (2) { ["n"]=> int(1) ["x:private"]=> array(2) { ["b"]=> int(2) ["c"]=> int(3) } }`

## Methodenüberladung

mixed __call ( string name, array arguments )

Klassenmethoden können überladen werden, um eigenen in Ihrer Klasse definierten Code auszuführen, indem man diese speziell benannte Methode definiert. Der `$name` Parameter ist der Name der Funktion, deren Benutzung angefordert wurde. Die Argumente, die der Funktion übergeben wurden, werden als ein Array im `$arguments` Parameter definiert. Der von der __call() Methode zurückgegebene Wert wird dem Aufrufer der Methode zurückgegeben.

Beispiel 19-21. Beispiel für Überladung mit __call
`<?php class Caller { private $x = array(1, 2, 3); public function __call($m, $a) { print "Methode $m aufgerufen:\n"; var_dump($a); return $this->x; } } $foo = new Caller(); $a = $foo->test(1, "2", 3.4, true); var_dump($a); ?>`
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
`Methode test aufgerufen: array(4) { [0]=> int(1) [1]=> string(1) "2" [2]=> float(3.4) [3]=> bool(true) } array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }`

Zurück | Zum Anfang | Weiter
Interfaces | Nach oben | Objektiteration