Konstruktoren und Destruktoren

Konstruktor

__construct(mixed ...$values = ""): void

PHP erlaubt es Entwicklern, Konstruktormethoden für Klassen zu deklarieren. Klassen mit Konstruktormethoden rufen diese für jedes neu erzeugte Objekt auf, sodass Konstruktoren für alle Initialisierungen passend sind, die das Objekt brauchen könnte, bevor es benutzt wird.

Hinweis: Konstruktoren von Elternklassen werden nicht implizit aufgerufen, wenn die Kindklasse einen Konstruktor definiert. Um einen Elternkonstruktor zu benutzen, ist ein Aufruf von parent::__construct() innerhalb des Kindkonstruktors notwendig. Falls das Kind keinen Konstruktor definiert, kann er von der Elternklasse genau wie eine normale Klassenmethode geerbt werden (falls er nicht als privat deklariert wurde).

Beispiel #1 Konstruktoren bei der Vererbung

<?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
}

// Im BaseClass-Konstruktor
$obj = new BaseClass();

// Im BaseClass-Konstruktor
// Im SubClass-Konstruktor
$obj = new SubClass();

// Im BaseClass-Konstruktor
$obj = new OtherSubClass();
?>

Im Gegensatz zu anderen Methoden ist __construct() ist ausgenommen von den üblichen Regeln für die Signaturkompatibilität. wenn sie erweitert wird.

Konstruktoren sind gewöhnliche Methoden, die bei der Instanziierung des entsprechenden Objekts aufgerufen werden. Als solche können sie eine beliebige Anzahl von Argumenten definieren, die erforderlich sein können, einen Typ haben können und einen Standardwert haben können. Konstruktorargumente werden aufgerufen, indem die Argumente in Klammern hinter den Klassennamen gesetzt werden.

Beispiel #2 Die Verwendung von Argumenten eines Konstruktors

<?php
class Punkt {
    protected 
int $x;
    protected 
int $y;

    public function 
__construct(int $xint $y 0) {
        
$this->$x;
        
$this->$y;
    }
}

// Beide Parameter übergeben.
$p1 = new Punkt(45);
// Nur den erforderlichen Parameter übergeben. $y nimmt den Standardwert von 0 an.
$p2 = new Punkt(4);
// Mit benannten Parametern (von PHP 8.0 an):
$p3 = new Punkt(y5x4);
?>

Wenn eine Klasse keinen Konstruktor hat oder der Konstruktor keine erforderlichen Argumente hat, können die Klammern weggelassen werden.

Konstruktoren alten Stils

Vor PHP 8.0.0 interpretieren Klassen im globalen Namensraum eine Methode, die den gleichen Namen wie die Klasse trägt, als Konstruktor alten Stils. Diese Syntax ist veraltet, und führt zu einem E_DEPRECATED-Fehler, ruft die Funktion aber trotzdem als Konstruktor auf. Wenn sowohl __construct() als auch eine Methode gleichen Namens definiert sind, wird __construct() aufgerufen.

In Namensraum-Klassen, oder ab PHP 8.0.0 in jeder Klasse, hat eine Methode mit dem Namen der Klasse keine besondere Bedeutung.

Verwenden Sie in neuem Code immer __construct().

Promotion (Beförderung) des Konstruktors

Ab PHP 8.0.0 können Konstruktorparameter auch so befördert werden, dass sie einer Objekteigenschaft entsprechen. Sehr häufig werden Konstruktorparameter einer Eigenschaft im Konstruktor zugewiesen, aber ansonsten nicht bearbeitet. Die Konstruktor-Promotion bietet eine Kurzform für diesen Anwendungsfall. Das obige Beispiel könnte wie folgt umgeschrieben werden:

Beispiel #3 Die Verwendung der Beförderung von Konstruktor-Eigenschaften

<?php
class Punkt {
    public function 
__construct(protected int $x, protected int $y 0) {
    }
}

Wenn ein Konstruktorargument einen Sichtbarkeitsmodifizierer enthält, interpretiert PHP es sowohl als Objekteigenschaft als auch als Konstruktorargument und weist der Eigenschaft den Wert des Arguments zu. Der Konstruktorkörper kann dann leer sein oder andere Anweisungen enthalten. Alle zusätzlichen Anweisungen werden ausgeführt, nachdem die Argumentwerte den entsprechenden Eigenschaften zugewiesen wurden.

Nicht alle Argumente müssen befördert werden. Beförderte und nicht beförderte Argumente können in beliebiger Reihenfolge zu kombiniert werden. Beförderte Argumente haben keinen Einfluss auf den Code, der den Konstruktor aufruft.

Hinweis:

Objekteigenschaften dürfen aufgrund der Mehrdeutigkeit, die in die Engine einfließen würde, nicht mit callable typisiert werden. Somit dürfen die angeführten Argumente auch nicht mit callable typisiert werden. Jede andere Typ-Deklaration ist jedoch erlaubt.

Hinweis:

Attribute, die auf ein befördertes Konstruktorargument gelegt werden, werden sowohl auf die Eigenschaft als auch auf das Argument übertragen.

New bei der Initialisierung

Ab PHP 8.1.0 können Objekte als Standardwerte für Parameter, als statische Variablen und globale Konstanten sowie in Eigenschaftsparametern verwendet werden. Objekte können nun auch an define() übergeben werden.

Hinweis:

Es ist nicht zulässig, einen dynamischen Klassennamen, einen Klassennamen, der keine Zeichenkette ist, oder eine anonyme Klasse zu verwenden. Es ist auch nicht zulässig, Parameter zu entpacken, und nicht unterstützte Ausdrücke als Parameter zu verwenden.

Beispiel #4 Verwendung von new bei Initialisierungen

<?php

// Alles zulässig:
static $x = new Foo;

const 
= new Foo;

function 
test($param = new Foo) {}

#[AnAttribute(new Foo)]
class Test {
    public function 
__construct(
        public 
$prop = new Foo,
    ) {}
}

// Alles nicht zulässig (Kompilierfehler):
function test(
    
$a = new (CLASS_NAME_CONSTANT)(), // dynamischer Klassenname
    
$b = new class {}, // anonyme Klasse
    
$c = new A(...[]), // Entpacken von Parametern
    
$d = new B($abc), // nicht unterstützter Ausdruck
) {}
?>

Erzeugung über statische Methoden

PHP unterstützt nur einen einzigen Konstruktor pro Klasse. In einigen Fällen, kann es jedoch wünschenswert sein, dass ein Objekt auf verschiedene Weisen mit unterschiedlichen Eingaben erzeugt werden kann. Der empfohlene Weg, dies zu tun, ist die, Konstruktoren in statische Methoden zu packen.

Beispiel #5 Die Erzeugung über statische Methoden verwenden

<?php
class Produkt {

    private ?
int $id;
    private ?
string $name;

    private function 
__construct(?int $id null, ?string $name null) {
        
$this->id $id;
        
$this->name $name;
    }

    public static function 
fromBasicData(int $idstring $name): static {
        
$neu = new static($id$name);
        return 
$neu;
    }

    public static function 
fromJson(string $json): static {
        
$daten json_decode($json);
        return new static(
$daten['id'], $daten['name']);
    }

    public static function 
fromXml(string $xml): static {
        
// Hier der eigene Code.
        
$daten convert_xml_to_array($xml);
        
$neu = new static();
        
$neu->id $daten['id'];
        
$neu->name $daten['name'];
        return 
$neu;
    }
}

$p1 Produkt::fromBasicData(5'Widget');
$p2 Produkt::fromJson($some_json_string);
$p3 Produkt::fromXml($some_xml_string);

Der Konstruktor kann private oder protected gemacht werden, um zu verhindern, dass er von außen aufgerufen wird. Wenn dies der Fall ist, kann nur eine statische Methode die Klasse instanziieren. Da sie in der gleichen Klassendefinition enthalten ist, hat sie Zugriff auf private Methoden, auch wenn sie nicht zur gleichen Objektinstanz gehören. Der private Konstruktor ist optional und kann je nach Anwendungsfall sinnvoll sein oder nicht.

Die drei public static Methoden veranschaulichen dann verschiedene Möglichkeiten das Objekt zu instanziieren.

  • fromBasicData() nimmt genau die Parameter, die benötigt werden, erzeugt dann das Objekt durch Aufruf des Konstruktors und Rückgabe des Ergebnisses.
  • fromJson() akzeptiert eine JSON-Zeichenkette und führt selbst eine Vorverarbeitung durch, um sie in das vom Konstruktor gewünschte Format zu konvertieren. Sie gibt dann das neue Objekt zurück.
  • fromXml() akzeptiert eine XML-Zeichenkette, vorverarbeitet sie und erzeugt dann ein leeres Objekt. Der Konstruktor wird immer noch aufgerufen, aber da alle Parameter optional sind, überspringt sie die Methode. Sie weist dann den Objekteigenschaften direkt Werte zu, bevor sie das Ergebnis zurückgibt.

In allen drei Fällen wird das Schlüsselwort static in den Namen der Klasse übersetzt, in der sich der Code befindet. In diesem Fall: Produkt.

Destruktor

__destruct(): void

PHP verfügt über ein Destruktorkonzept ähnlich dem anderer objektorientierter Programmiersprachen wie C++. Die Destruktormethode wird aufgerufen, sobald es keine weiteren Referenzen auf ein bestimmtes Objekt mehr gibt, oder in beliebiger Reihenfolge am Ende des Skripts.

Beispiel #6 Destruktor-Beispiel

<?php

class MyDestructableClass
{
    function 
__construct() {
        print 
"Im Konstruktor\n";
    }

    function 
__destruct() {
        print 
"Zerstoere " __CLASS__ "\n";
    }
}

$obj = new MyDestructableClass();

Wie Konstruktoren auch, werden Elterndestruktoren nicht implizit durch die Engine aufgerufen. Um einen Elterndestruktor zu benutzen muss man explizit die Funktion parent::__destruct() in der Destruktorimplementierung aufrufen. Ebenso wie Konstruktoren kann eine Kindklasse den Destruktor der Eltern erben, falls sie keinen eigenen implementiert.

Der Destruktor wird aufgerufen, wenn das Skript 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 am Ende des Skripts aufgerufen wird) heraus zu auszulösen, führt zu einem fatalen Fehler.

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Grundlagen von Views in MySQL

Views in einer MySQL-Datenbank bieten die Möglichkeit, eine virtuelle Tabelle basierend auf dem Ergebnis einer SQL-Abfrage zu erstellen. ...

admin

Autor : admin
Kategorie: mySQL-Tutorials

Definition von Stored Procedures - eine Einführung

Stored Procedures sind vordefinierte SQL-Codeblöcke, die in einer Datenbank gespeichert sind und bei Bedarf aufgerufen werden können. ...

Bernie

Autor : ebiz-consult GmbH & Co. KG
Kategorie: mySQL-Tutorials

Wie kann man komplexe Abfragen mit SQL-Querys In MySQLi effektiv durchführen?

In diesem MySQL-Tutorial wird erklärt, wie komplexe SQL-Abfragen in MySQLi effizient durchgeführt werden können. Wir werden uns mit verschiedenen Aspekten der Datenbankabfrage beschäftigen und spezifische Methoden kennenlernen. ...

TheMax

Autor : TheMax
Kategorie: mySQL-Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

[Wichtig] Anmeldung im Forum

Guess the hidden word using logic and deduction in the engaging game of Wordle. Wordle nyt (https://wordlenytimes.net/) ​

Geschrieben von lenytimes am 19.04.2024 19:21:45
Forum: Fragen/Vorschläge zum Forum
Professioneller Webentwickler & Webdesigner

Of course, here is the translation: Hello, Thank you for your interest in the long-term project. Your extensive skills and experience in web dev ...

Geschrieben von Athelstan am 15.04.2024 09:25:39
Forum: Jobgesuche
Wir stellen unsere SEO-Agentur vor

Hallo In der heutigen digitalen Welt war es für Unternehmen noch nie so einfach, ihre Reichweite weltweit zu vergrößern. Wenn Sie außerhalb I ...

Geschrieben von thomasmuller am 14.04.2024 07:18:33
Forum: User stellen sich vor
Spielplan für 4 Gruppen zu je 6 Teams auf 2 Feldern

Hallöchen zusammen, ich versuche derzeit unseren Excel-Spielplan in PHP zu überführen. Eigentlich bin ich auch shon fertig - wenn da nicht dies ...

Geschrieben von derH0st am 11.04.2024 15:58:37
Forum: PHP Developer Forum