PHP 5 erlaubt es Entwicklern, Konstruktormethoden für Klassen zu deklarieren. Klassen mit Konstruktormethoden rufen diese für jedes neu erzeugte Objekt auf, so dass Konstruktoren für alle Initialisierungen passend sind, die das Objekt brauchen könnte bevor es benutzt wird.
Hinweis: Konstruktoren von Vaterklassen werden nicht implizit aufgerufen, wenn die Kindklasse einen Konstruktor definiert. Um einen Vaterkonstruktor zu benutzen ist ein Aufruf von parent::__construct() innerhalb des Kindkonstruktors notwendig. Falls das Kind keinen Konstruktor definiert, dann kann er von der Vaterklasse genau wie eine normale Klassenmethode geerbt werden (falls er nicht als privat deklariert wurde).
Beispiel #1 Die neuen, vereinheitlichten Konstruktoren verwenden
<?php
class BaseClass {
function __construct() {
print "Im BaseClass Konstruktor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "Im SubClass Konstruktor\n";
}
}
class OtherSubClass extends BaseClass {
// erbt den Konstruktor von BaseClass
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
Aus Gründen der Abwärtskompatibilität mit PHP 3 und 4 sucht PHP, falls keine __construct() Methode vorhanden ist, nach einem Konstruktur des alten Stils, d.h. einer Methode mit dem selben Namen wie die Klasse. Der einzige Fall in dem somit Kompatibilitätsprobleme auftreten können, ist wenn die Klasse eine Methode __construct() definiert, welche jedoch für andere Zwecke benutzt wird.
Konstruktoren des alten Stils wurden in PHP 7.0 MISSBILLIGT, und werden in einer zukünftigen Version entfernt. Neuer Code sollte immer __construct() verwenden.
Im Gegensatz zu anderen Methoden, generiert PHP keinen E_STRICT
Fehler, wenn __construct() in einer Kindklasse
andere Parameter definiert, als die __construct()
Methode der Elternklasse.
Seit PHP 5.3.3 werden Methoden, welche mit dem Klassennamen übereinstimmen, nicht länger als Konstruktoren behandelt, wenn die Klasse sich in einem Namespace befindet. Klassen, welche sich nicht in einem Namespace befinden, betrifft dies jedoch nicht.
Beispiel #2 Konstruktoren in Klassen in Namespaces
<?php
namespace Foo;
class Bar {
public function Bar() {
// wird in PHP 5.3.0-5.3.2 als Konstruktor behandelt
// wird in PHP 5.3.3 und höher als reguläre Methode behandelt
}
}
?>
PHP 5 führt ein Destruktorkonzept ähnlich dem anderer objektorientierter Programmiersprachen wie C++ ein. Die Destruktormethode wird aufgerufen, sobald es keine weiteren Referenzen auf ein bestimmtes Objekt mehr gibt, oder in beliebiger Reihenfolge am Ende des Skripts.
Beispiel #3 Destruktor Beispiel
<?php
class MyDestructableClass
{
function __construct() {
print "Im Konstruktor\n";
}
function __destruct() {
print "Zerstoere " . __CLASS__ . "\n";
}
}
$obj = new MyDestructableClass();
?>
Wie Konstruktoren auch, werden Vaterdestruktoren nicht implizit durch die Engine aufgerufen. Um einen Vaterdestruktor zu benutzen muss man explizit die Funktion parent::__destruct() in der Destruktorimplementierung aufrufen. Ebenso wie Konstruktoren kann eine Kindklasse den Destruktor des Vaters erben, falls sie keinen eigenen implementiert.
Der Destruktor wird aufgerufen, wenn das Script mittels exit() abgebrochen wird. Wenn exit() innerhalb eines Destruktors aufgerufen wird, verhindert das die Ausführung von jeglichen weiteren Shutdown Routinen.
Hinweis:
Der Destruktor wird während der Skript-Abschaltung aufgerufen, weshalb die Header immer bereits gesendet sind. Das aktuelle Verzeichnis während der Beendigungsphase des Skripts kann bei einigen SAPIs (z.B. Apache) ein anderes sein.
Hinweis:
Der Versuch eine Exception aus einem Destruktor (der in der Beendigungsphase des Skripts aufgerufen wurde) heraus zu werfen wird einen fatalen Fehler auslösen.