Constructor Promotion (8.0)
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 42 von 91.
PHP 8.0 hat die Constructor Promotion eingeführt, ein Feature, das den Boilerplate-Code bei der Definition von Klassen drastisch reduziert. Anstatt Eigenschaften separat zu deklarieren und sie dann im Konstruktor zuzuweisen, können Sie beides in einem Schritt erledigen.
Hier ist der traditionelle Ansatz, den Sie bisher verwendet haben:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
Mit der Constructor Promotion fügen Sie den Zugriffsmodifikator direkt den Konstruktor-Parametern hinzu:
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
$product = new Product("Laptop", 999.99);
echo $product->getInfo();
Ausgabe:
Laptop: $999.99Durch Hinzufügen von private, protected oder public vor einem Konstruktor-Parameter erstellt PHP automatisch die Eigenschaft und weist den Wert zu. Sie können beförderte (promoted) und reguläre Parameter im selben Konstruktor mischen und bei Bedarf weiterhin Logik innerhalb des Konstruktor-Bodys hinzufügen.
Wichtiger Punkt: Constructor Promotion eliminiert wiederholte Eigenschaftsdeklarationen und -zuweisungen, was Ihre Klassen übersichtlicher und lesbarer macht, während die vollständige Kontrolle über die Kapselung erhalten bleibt.
Aufgabe
EinfachLassen Sie uns ein Kontaktverwaltungssystem erstellen, das die Eleganz der Constructor Promotion demonstriert. Sie werden eine saubere, moderne PHP-Klasse erstellen, die Boilerplate-Code eliminiert und gleichzeitig eine ordnungsgemäße Kapselung beibehält.
Sie werden Ihren Code auf zwei Dateien aufteilen:
Contact.php— Erstellen Sie eineContact-Klasse unter Verwendung von Constructor Promotion, um alle Eigenschaften direkt in der Konstruktorsignatur zu definieren. Ihr Kontakt sollte Folgendes haben:- Eine private
$name-Eigenschaft (string) - Eine private
$email-Eigenschaft (string) - Eine private
$phone-Eigenschaft (string) mit einem Standardwert von"Not provided"
getFullDetails()hinzu, die"[name] | [email] | [phone]"zurückgibt. Fügen Sie außerdem eine MethodegetSummary()hinzu, die"Contact: [name]"zurückgibt.- Eine private
main.php— Binden Sie die Datei Contact ein. Sie erhalten drei Eingaben: einen Namen, eine E-Mail-Adresse und eine Telefonnummer. Erstellen Sie zweiContact-Instanzen:- Der erste Kontakt sollte alle drei Werte verwenden (Name, E-Mail und Telefon)
- Der zweite Kontakt sollte nur den Namen und die E-Mail verwenden (und sich auf den Standard-Telefonwert verlassen)
- Die vollständigen Details des ersten Kontakts
- Die Zusammenfassung des ersten Kontakts
- Die vollständigen Details des zweiten Kontakts
- Die Zusammenfassung des zweiten Kontakts
Beachten Sie, wie Sie mit Constructor Promotion Eigenschaften definieren, deren Sichtbarkeit festlegen, deren Typen deklarieren und Werte zuweisen können — alles in einer einzigen, lesbaren Konstruktorsignatur. Der optionale Telefonparameter mit einem Standardwert zeigt, dass promoted Parameter nahtlos mit Standardwerten funktionieren, genau wie reguläre Parameter.
Spickzettel
PHP 8.0 hat die Constructor Promotion eingeführt, die es ermöglicht, Klasseneigenschaften direkt in den Konstruktor-Parametern zu deklarieren und zu initialisieren, indem ein Zugriffsmodifikator hinzugefügt wird.
Traditioneller Ansatz:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
}
Mit Constructor Promotion:
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
}
$product = new Product("Laptop", 999.99);
Durch das Hinzufügen von private, protected oder public vor einem Konstruktor-Parameter erstellt PHP automatisch die Eigenschaft und weist den Wert zu.
Sie können Standardwerte mit beförderten Parametern verwenden:
<?php
class Contact {
public function __construct(
private string $name,
private string $email,
private string $phone = "Not provided"
) {}
}
Constructor Promotion kann mit regulären Parametern gemischt werden, und Sie können bei Bedarf weiterhin Logik innerhalb des Konstruktor-Bodys hinzufügen.
Probier es selbst
<?php
require_once 'Contact.php';
// Eingabe lesen
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: Ersten Kontakt mit allen drei Werten erstellen (Name, E-Mail, Telefon)
// TODO: Zweiten Kontakt nur mit Name und E-Mail erstellen (Standard-Telefonnummer verwenden)
// TODO: Vollständige Details des ersten Kontakts ausgeben
// TODO: Zusammenfassung des ersten Kontakts ausgeben
// TODO: Vollständige Details des zweiten Kontakts ausgeben
// TODO: Zusammenfassung des zweiten Kontakts ausgeben
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung