Menu
Coddy logo textTech

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.99

Durch 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.

challenge icon

Aufgabe

Einfach

Lassen 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 eine Contact-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"
    Verwenden Sie die Syntax der Constructor Promotion — es sind keine separaten Eigenschaftsdeklarationen erforderlich! Fügen Sie eine öffentliche Methode getFullDetails() hinzu, die "[name] | [email] | [phone]" zurückgibt. Fügen Sie außerdem eine Methode getSummary() hinzu, die "Contact: [name]" zurückgibt.
  • main.php — Binden Sie die Datei Contact ein. Sie erhalten drei Eingaben: einen Namen, eine E-Mail-Adresse und eine Telefonnummer. Erstellen Sie zwei Contact-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)
    Geben Sie vier Zeilen aus:
    • 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

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung