Konstruktor-Promotion (8.0)
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 42 von 91.
PHP 8.0 führte die Konstruktor-Promotion ein, eine Funktion, die den Boilerplate-Code beim Definieren von Klassen drastisch reduziert. Anstatt Eigenschaften separat zu deklarieren und sie anschließend im Konstruktor zuzuweisen, kannst du beides in einem Schritt erledigen.
Hier ist der traditionelle Ansatz, den du bisher verwendet hast:
<?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 Konstruktor-Promotion fügst du den Zugriffsmodifikator direkt zu den Konstruktorparametern 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.99Indem du private, protected oder public vor einem constructor-parameters hinzufügst, erstellt PHP automatisch die Eigenschaft und weist ihr den Wert zu. Du kannst promoted und reguläre parameters im selben constructor mischen und bei Bedarf weiterhin Logik im Körper des constructor hinzufügen.
Wichtiger Punkt: Die Konstruktor-Promotion eliminiert sich wiederholende Eigenschaftsdeklarationen und Zuweisungen und macht deine Klassen übersichtlicher und leichter lesbar, während die vollständige Kontrolle über die Kapselung erhalten bleibt.
Aufgabe
EinfachLass uns ein Kontaktverwaltungssystem erstellen, das die Eleganz der Konstruktor-Promotion demonstriert. Du erstellst eine klare, moderne PHP-Klasse, die Boilerplate-Code vermeidet und gleichzeitig eine ordnungsgemäße Kapselung gewährleistet.
Du organisierst deinen Code über zwei Dateien:
Contact.php: Erstelle eineContact-Klasse, die Konstruktor-Promotion verwendet, um alle Eigenschaften direkt in der Konstruktorsignatur zu definieren. Dein Kontakt sollte Folgendes besitzen:- Eine private
$name-Eigenschaft (String) - Eine private
$email-Eigenschaft (String) - Eine private
$phone-Eigenschaft (String) mit dem Standardwert"Not provided"
getFullDetails()hinzu, die"[name] | [email] | [phone]"zurückgibt. Füge außerdem eine MethodegetSummary()hinzu, die"Contact: [name]"zurückgibt.- Eine private
main.php: Binde die Contact-Datei ein. Du erhältst drei Eingaben: einen Namen, eine E-Mail-Adresse und eine Telefonnummer. Erstelle zweiContact-Instanzen:- Der erste Kontakt sollte alle drei Werte verwenden (Name, E-Mail-Adresse und Telefonnummer).
- Der zweite Kontakt sollte nur den Namen und die E-Mail-Adresse verwenden (und sich auf den Standardwert für die Telefonnummer 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
Beachte, wie du mit der Konstruktor-Promotion Eigenschaften definieren, ihre Sichtbarkeit festlegen, ihre Typen deklarieren und Werte zuweisen kannst – alles in einer einzigen, übersichtlichen Konstruktorsignatur. Der optionale Parameter für die Telefonnummer mit einem Standardwert zeigt, dass promotete Parameter nahtlos mit Standardwerten funktionieren, genau wie reguläre Parameter.
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, email, phone)
// TODO: Zweiten Kontakt nur mit name und email erstellen (Standard-phone 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 OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler