Nehmen Sie dieses Beispiel:
abstract class Base {
function __construct() {
echo 'Base __construct<br/>';
}
}
class Child extends Base {
function __construct() {
echo 'Child __construct<br/>';
}
}
$c = new Child();
Da ich aus einem C # -Hintergrund komme, erwarte ich, dass die Ausgabe lautet
Basis __konstruieren
Kind __konstruieren
Die tatsächliche Ausgabe ist jedoch gerecht
Kind __konstruieren
Nein, der Konstruktor der Elternklasse wird nicht aufgerufen, wenn die Kindklasse einen Konstruktor definiert.
Vom Konstruktor Ihrer untergeordneten Klasse müssen Sie den Konstruktor der übergeordneten Klasse aufrufen:
parent::__construct();
Übergabe von Parametern, falls erforderlich.
Im Allgemeinen tun Sie dies am Anfang des Konstruktors der untergeordneten Klasse, vor einem bestimmten Code ; was bedeutet, in Ihrem Fall hätten Sie:
class Child extends Base {
function __construct() {
parent::__construct();
echo 'Child __construct<br/>';
}
}
Und als Referenz können Sie sich diese Seite des PHP-Handbuchs ansehen: Konstruktoren und Destruktoren — Es sagt aus (Zitat) :
Notiz: Übergeordnete Konstruktoren werden nicht implizit aufgerufen, wenn die untergeordnete Klasse einen Konstruktor definiert.
Um einen übergeordneten Konstruktor auszuführen, muss ein Aufruf von
parent::__construct()
innerhalb des untergeordneten Konstruktors ist erforderlich.
Nun, ich habe das gerade in der gefunden Dokumente:
Hinweis: Übergeordnete Konstruktoren werden nicht implizit aufgerufen, wenn die untergeordnete Klasse einen Konstruktor definiert. Um einen übergeordneten Konstruktor auszuführen, ist ein Aufruf von parent::__construct() innerhalb des untergeordneten Konstruktors erforderlich.
Wenn Sie dasselbe Verhalten wie C# benötigen, d. h. der übergeordnete Konstruktor wird immer vor dem untergeordneten Konstruktor ausgeführt, können Sie eine gefälschte Konstruktorklasse für Ihre untergeordneten Klassen erstellen und sie als abstrakte Funktion in Ihrer abstrakten übergeordneten Klasse deklarieren.
Z.B
abstract class Test{
abstract public function __childconstruct();
public function __construct(){
echo "SOME CODE".PHP_EOL;
$this->__childconstruct();
}
}
class TestExtended extends Test{
public function __childconstruct(){
echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL;
}
}
$a = new TestExtended();
/* SOME CODE
SOME OTHER CODE FROM EXTENDED CLASS */
13351900cookie-checkWerden abstrakte Klassenkonstruktoren nicht implizit aufgerufen, wenn eine abgeleitete Klasse instanziiert wird?yes