PHP Handbuch | ||
---|---|---|
Zurück | Kapitel 14. Klassen und Objekte | Nach vorne |
Achtung |
In PHP 3 und PHP 4 verhalten sich die Konstruktoren unterschiedlich. Die PHP 4 Semantik wird dringend empfohlen. |
Konstruktoren sind Funktionen innerhalb einer Klasse, die automatisch aufgerufen wird, sobald Sie mittels new eine neue Instanz erstellen. In PHP 3 wird eine Funktion zum Konstruktor, wenn sie den gleichen Namen wie die Klasse hat. In PHP 4 wird eine Funktion zum Konstruktor, wenn sie den gleichen Namen wie die Klasse hat, in der sie definiert ist. Der Unterschied ist subtil, aber entscheidend (siehe unten).
// Funktioniert sowohl in PHP 3, als auch in PHP 4. class Auto_Cart extends Cart { function Auto_Cart() { $this->add_item ("10", 1); } } |
Die Klasse Auto_Cart entspricht der Klasse Cart und hat einen Konstruktor, der Cart bereits mit einem Artikel der Nummer "10" initialisiert, sobald ein neuer Auto_Cart mittels "new" erstellt wird. Konstruktoren können Argumente übernehmen, die optional sein können, was sie sehr praktisch macht. Um eine Klasse auch ohne Parameter verwenden zu können, sollten alle Parameter für Konstruktoren optional sein, indem sie mit Standardwerten ausgestattet werden.
// Funktioniert sowohl in PHP 3, als auch in PHP 4. class Constructor_Cart extends Cart { function Constructor_Cart($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Kaufe das gleiche alte Zeug ein. $default_cart = new Constructor_Cart; // Kaufe etwas anderes... $different_cart = new Constructor_Cart("20", 17); |
Achtung |
In PHP 3 haben abgeleitete Klassen und Konstruktoren ein paar Einschränkungen. Sie sollten das folgende Beispiel sorgfältig lesen, um diese Einschränkungen zu verstehen. |
class A { function A() { echo "I am the constructor of A.<br>\n"; } } class B extends A { function C() { echo "I am a regular function.<br>\n"; } } // In PHP 3 wurde kein Konstruktor aufgerufen. $b = new B; |
In PHP 3 wird bei dem obigen Beispiel kein Konstruktor aufgerufen. Die Regel in PHP 3 besagt: 'Ein Konstruktor ist eine Funktion mit dem selben Namen wie die Klasse'. Der Name der Klasse ist B, und nachdem in Klasse B keine Funktion namens B() existiert, passiert nichts.
Dies ist in PHP 4 mit der Einführung einer anderen Regel behoben: Wenn eine Klasse keinen Konstruktor hat, wird der Konstruktor der Basisklasse aufgerufen, so dieser existiert. Das obige Beispiel hätte in PHP 4 also 'I am the constructor of A.<br>' ausgegeben.
class A { function A() { echo "I am the constructor of A.<br>\n"; } function B() { echo "I am a regular function named B in class A.<br>\n"; echo "I am not a constructor in A.<br>\n"; } } class B extends A { function C() { echo "I am a regular function.<br>\n"; } } // Dies ruft B() als Konstruktor auf. $b = new B; |
In PHP 3 wird die Funktion B() in der Klasse A plötzlich zum Konstruktor in Klasse B, auch wenn dies nie beabsichtigt war. Die Regel in PHP 3 lautet: 'Ein Konstruktor ist eine Funktion mit dem gleichen Namen wie die Klasse'. PHP 3 kümmert sich nicht darum, ob die Funktion in Klasse B definiert, oder ob sie nur vererbt wurde.
Dies ist in PHP 4 mit einer modifizierten Regel behoben: 'Ein Konstruktor ist eine Funktion mit dem selben Namen wie die Klasse, in der sie definiert wurde'. So hätte die Klasse B in dem obigen Beispiel keinen eigenen Konstruktor, und würde der Konstruktor der Basisklasse aufgerufen, welcher 'I am the constructor of A.<br>' ausgeben würde.
Achtung |
Weder PHP 3, noch PHP 4 rufen vom Konstruktor der abgeleiteten Klasse aus automatisch Konstruktoren der Basisklasse auf. Wenn angebracht, ist der Aufruf von Konstruktoren aufwärts Ihre Aufgabe. |
Anmerkung: In PHP 3 und PHP 4 gibt es keine Destruktoren. Stattdessen können Sie register_shutdown_function() verwenden, um die meisten Effekte von Destruktoren zu simulieren.
Destruktoren sind Funktionen die automatisch aufgerufen werden, wenn ein Objekt entweder mittels unset(), oder durch Verlassen des Gültigkeitsbereiches zerstört wird. Es gibt in PHP keine Destruktoren.
Zurück | Zum Anfang | Nach vorne |
extends | Nach oben | :: |