Konstruktor ¶
void__construct ([ gemischt$args [, $... ]] )
PHP 5 ermöglicht Entwicklern, eine Methode als Konstruktor in einer Klasse zu definieren. Klassen mit einem Konstruktor rufen diese Methode jedes Mal auf, wenn ein neues Objekt erstellt wird. Sie eignet sich daher sehr gut für einige Initialisierungsarbeiten vor der Verwendung des Objekts.
Hinweis: Wenn ein Konstruktor in einer Unterklasse definiert ist, wird der Konstruktor seiner übergeordneten Klasse nicht implizit aufgerufen. Um den Konstruktor der übergeordneten Klasse auszuführen, müssen Sie parent::__construct() im Konstruktor der untergeordneten Klasse aufrufen. Wenn die Unterklasse keinen Konstruktor definiert, wird sie wie eine gewöhnliche Klassenmethode von der übergeordneten Klasse geerbt (sofern sie nicht als privat definiert ist).
Beispiel #1 Verwendung des neuen Standardkonstruktors
class BaseClass { function __construct(){ print "In BaseClass constructor<br>"; } } class SubClass extends BaseClass { function __construct(){ parent::__construct(); print "In SubClass constructor<br>"; } } class OtherSubClass extends BaseClass {} $obj = new BaseClass(); $obj = new SubClass(); $obj = new OtherSubClass();
Ausgabeergebnis:
Im BaseClass-Konstruktor
Im BaseClass-Konstruktor
Im SubClass-Konstruktor
Im BaseClass-Konstruktor
Wenn PHP 5 aus Gründen der Abwärtskompatibilität die Funktion __construct() in der Klasse nicht finden kann und keine von der übergeordneten Klasse erbt, wird dies versucht Suchen Sie den Konstruktor im alten Stil, bei dem es sich um eine Funktion mit demselben Namen wie die Klasse handelt. Daher treten Kompatibilitätsprobleme nur dann auf, wenn die Klasse bereits über eine Methode namens __construct() verfügt, diese jedoch für andere Zwecke verwendet wird.
Im Gegensatz zu anderen Methoden generiert PHP keine E_STRICT-Fehlermeldung, wenn __construct() von einer Methode mit anderen Parametern als der übergeordneten Klasse __construct() überschrieben wird.
Seit PHP 5.3.3 werden im Namespace Methoden mit demselben Namen wie der Klassenname nicht mehr als Konstruktoren verwendet. Diese Änderung wirkt sich nicht auf Klassen aus, die sich nicht im Namespace befinden.
Beispiel Nr. 2 Konstruktoren in Namespace-Klassen
namespace Foo; class Bar{ public function Bar(){ //在PHP5.3.0-5.3.2中被看作是构造函数 //自PHP5.3.3起被视作一个普通的方法 } }
Destruktor ¶
void__destruct (void)
PHP 5 führte den Destruktor ein. Das Konzept ähnelt andere objektorientierte Sprachen wie C. Ein Destruktor wird ausgeführt, wenn alle Verweise auf ein Objekt entfernt werden oder wenn das Objekt explizit zerstört wird.
Beispiel Nr. 3 Destruktorbeispiel
<?php class MyDestructableClass{ function __construct(){ print "In constructor<br>"; $this->name = "MyDestructableClass"; } function __destruct(){ print "Destroying ".$this->name.'<br>'; } } $obj = new MyDestructableClass(); ?>
Ausgabeergebnis:
Im Konstruktor
Zerstören von MyDestructableClass
und Konstruktor Ebenso die Der Destruktor der übergeordneten Klasse wird von der Engine nicht heimlich aufgerufen. Um den Destruktor der übergeordneten Klasse auszuführen, muss parent::__destruct() explizit im Destruktorkörper der untergeordneten Klasse aufgerufen werden. Darüber hinaus erbt die Unterklasse genau wie der Konstruktor die übergeordnete Klasse, wenn sie keinen Destruktor definiert.
Der Destruktor wird auch dann aufgerufen, wenn exit() zum Beenden des Skripts verwendet wird. Durch den Aufruf von „exit()“ im Destruktor wird der Rest des Shutdown-Vorgangs abgebrochen.
Hinweis:
Der Destruktor wird aufgerufen, wenn das Skript geschlossen wird, nachdem alle HTTP-Header gesendet wurden. Es ist möglich, dass das Arbeitsverzeichnis beim Schließen des Skripts ein anderes ist als in einem SAPI (z. B. Apache).
Hinweis:
Der Versuch, eine Ausnahme im Destruktor auszulösen (der aufgerufen wird, wenn das Skript beendet wird), führt zu einem schwerwiegenden Fehler.