Ein PHP-Konstruktor ist eine Methode namens __construct(). PHP ruft sie automatisch auf, wenn du new ClassName(...) schreibst, und die Argumente in den Klammern werden zu ihren Parametern, sodass das Objekt mit bereits gesetzten Werten startet.
Ohne Konstruktor würdest du ein leeres Objekt erzeugen und danach jede Eigenschaft setzen, und nichts würde dich davon abhalten, eine zu vergessen. Mit Konstruktor ist new User() ohne Argumente ein ArgumentCountError.
Constructor Property Promotion
Eine Eigenschaft zu deklarieren, sie als Parameter aufzuführen und $this->name = $name zuzuweisen, wiederholt jeden Namen dreimal. Seit PHP 8.0 erledigt ein Sichtbarkeits-Schlüsselwort vor einem Konstruktorparameter alle drei Schritte auf einmal:
Ein promoteter Parameter kann auch readonly sein (public readonly string $id), der kürzeste Weg, ein unveränderliches Value Object zu schreiben. Du kannst promotete und normale Parameter mischen, und der Konstruktorrumpf kann weiterhin Code enthalten, der nach der Zuweisung der promoteten Eigenschaften läuft.
Standardwerte und benannte Argumente
Konstruktorparameter nehmen Standardwerte wie jede Funktion. Parameter mit Standardwerten stehen nach den Pflichtparametern. Mit benannten Argumenten (PHP 8.0) kann der Aufrufer direkt zur gewünschten Option springen, statt jeden Standardwert davor zu wiederholen:
Führe es aus: Die Ausgabe enthält HTML, also zeigt der Tab Page die drei Buttons gerendert, und der Tab Output zeigt die Tags, die PHP ausgegeben hat. Beachte die Klammern in (new Button('Save'))->render(): Seit PHP 8.4 sind sie optional, aber PHP 8.3 braucht sie.
Argumente im Konstruktor validieren
Ein Konstruktor kann kein false und keinen Fehlercode zurückgeben: Was er zurückgibt, wird ignoriert. Um ungültige Eingaben abzulehnen, wirfst du eine Exception. Das Objekt wird dann nie erzeugt, also kann sich der Rest des Programms auf jede Temperature verlassen, die es bekommt.
Die Seite zu try catch behandelt das Abfangen dieser Exceptions ausführlicher.
Mehrere Konstruktoren mit statischen Factory-Methoden
PHP hat kein Überladen von Konstruktoren: eine Klasse, ein __construct. Wenn sich ein Objekt aus verschiedenen Eingaben bauen lässt (einem Datums-String, einem Array, einem Timestamp), fügst du benannte statische Methoden hinzu, die die Argumente vorbereiten und new static(...) aufrufen. Ein private Konstruktor zwingt alle, über die Factories zu gehen.
new Color(1, 2, 3) von außerhalb der Klasse wirft jetzt einen Error („Call to private Color::__construct() from global scope“). Die Seite zu static erklärt, warum hier new static statt new self verwendet wird.
Den Elternkonstruktor mit parent::__construct aufrufen
Wenn eine Kindklasse ihren eigenen Konstruktor definiert, läuft der Konstruktor der Elternklasse nicht von selbst. Ruf ihn mit parent::__construct(...) auf, meist zuerst, damit die Eigenschaften der Elternklasse gesetzt sind, bevor das Kind seine eigenen hinzufügt:
Hat das Kind gar keinen Konstruktor, verwendet PHP den der Elternklasse, und new Truck('Volvo') würde seine Argumente direkt an Vehicle::__construct übergeben. Mehr dazu unter Vererbung.
parent::__construct vergessen
Dieser Fehler erzeugt in der Zeile, in der er passiert, keinen Fehler. Der Kindkonstruktor läuft, die typisierten Eigenschaften der Elternklasse bleiben nicht initialisiert, und das Programm scheitert später, wo auch immer zuerst gelesen wird:
Füge parent::__construct(); als erste Zeile von Post::__construct hinzu und führe den Code erneut aus: Er gibt das Datum aus. Eine verwandte Methode, __destruct(), läuft, wenn der letzte Verweis auf ein Objekt verschwindet oder das Skript endet. Im Alltag braucht man sie selten, weil PHP am Ende jeder Anfrage Dateien schließt und Speicher selbst freigibt.
Häufig gestellte Fragen
Was ist __construct in PHP?
__construct() ist der Konstruktor: eine Methode, die PHP automatisch aufruft, direkt nachdem new das Objekt erzeugt hat. Die Argumente, die du an new User('Ada', 36) übergibst, gehen an __construct(string $name, int $age), das sie meist in Eigenschaften speichert.
Was ist Constructor Property Promotion in PHP?
Seit PHP 8.0 deklariert ein Sichtbarkeits-Schlüsselwort vor einem Konstruktorparameter die Eigenschaft und weist sie in einem Schritt zu: public function __construct(private string $name) {} entspricht der Deklaration private string $name; plus $this->name = $name; im Rumpf.
Kann eine PHP-Klasse mehrere Konstruktoren haben?
Nein. PHP hat kein Überladen von Methoden, also hat eine Klasse ein __construct. Verwende optionale Parameter mit Standardwerten oder füge statische Factory-Methoden wie public static function fromArray(array $data): static hinzu, die new static(...) mit den richtigen Argumenten aufrufen.
Wird der Elternkonstruktor in PHP automatisch aufgerufen?
Nur, wenn die Kindklasse keinen eigenen Konstruktor hat. Definiert das Kind __construct, läuft der Konstruktor der Elternklasse nicht, außer du rufst selbst parent::__construct(...) auf, meist in der ersten Zeile.
Kann ein PHP-Konstruktor einen Wert zurückgeben?
Nein. new liefert immer das Objekt, und was __construct zurückgibt, wird ignoriert. Um ein Problem zu melden, wirfst du im Konstruktor eine Exception, zum Beispiel throw new InvalidArgumentException('Age must be positive').