Menu
Coddy logo textTech

Abstrakte Methoden in Traits

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 54 von 91.

Traits können sofort einsatzbereite Methoden bereitstellen, aber manchmal muss die Klasse, die den Trait verwendet, eine bestimmte Funktionalität implementieren. Hier kommen abstrakte Methoden in Traits zum Einsatz – sie definieren einen Vertrag, den die verwendende Klasse erfüllen muss.

Wenn ein Trait eine abstrakte Methode deklariert, muss jede Klasse, die diesen Trait verwendet, sie implementieren:

<?php
trait Notifiable {
    abstract public function getEmail(): string;
    
    public function sendNotification(string $message): void {
        echo "Sending to " . $this->getEmail() . ": $message";
    }
}

class User {
    use Notifiable;
    
    public function __construct(private string $email) {}
    
    public function getEmail(): string {
        return $this->email;
    }
}

$user = new User("john@example.com");
$user->sendNotification("Welcome!");

Ausgabe:

Sending to john@example.com: Welcome!

Das Trait stellt die Methode sendNotification() bereit, ist jedoch darauf angewiesen, dass getEmail() von der Klasse implementiert wird. Dadurch entsteht ein leistungsstarkes Muster, bei dem das Trait die allgemeine Logik übernimmt und klassenspezifische Details an die implementierende Klasse delegiert.

Wenn eine Klasse das Trait verwendet, ohne die abstrakte Methode zu implementieren, löst PHP einen schwerwiegenden Fehler aus. Dadurch wird sichergestellt, dass Traits sicher davon ausgehen können, dass bestimmte Methoden vorhanden sind, wodurch dein Code vorhersehbarer und leichter wartbar wird.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Preissystem, in dem verschiedene Produkttypen ihre Endpreise unterschiedlich berechnen, aber alle gemeinsame Rabattlogik über ein Trait mit einer abstrakten Methode verwenden.

Du organisierst deinen Code über drei Dateien:

  • Discountable.php: Erstelle ein Trait namens Discountable, das Rabattfunktionen bereitstellt. Das Trait sollte Folgendes enthalten:
    • Eine abstrakte Methode getBasePrice(): float, die Klassen, die dieses Trait verwenden, implementieren müssen
    • Eine Methode applyDiscount(int $percent), die den Preis nach Anwendung des Rabattprozentsatzes auf den Grundpreis berechnet und zurückgibt
    • Eine Methode getFinalPrice(int $percent), die einen formatierten String zurückgibt: "Final price: $[discounted_price]" mit 2 Dezimalstellen
    Das Trait übernimmt die gesamte Rabattberechnung, verlässt sich aber darauf, dass jede Klasse angibt, wie hoch der Grundpreis ist.
  • Product.php: Erstelle eine Product-Klasse, die das Discountable-Trait verwendet. Binde die Trait-Datei ein. Verwende Konstruktor-Promotion, um einen privaten $name-Wert (string) und einen privaten $price-Wert (float) zu definieren. Implementiere die erforderliche Methode getBasePrice(), sodass sie den Preis des Produkts zurückgibt.
  • main.php: Binde die Product-Datei ein. Du erhältst drei Eingaben: einen Produktnamen, einen Preis und einen Rabattprozentsatz. Erstelle eine Product-Instanz und gib zwei Zeilen aus:
    • Den formatierten Grundpreis als "Base: $[price]" mit 2 Dezimalstellen
    • Das Ergebnis des Aufrufs von getFinalPrice() mit dem Rabattprozentsatz

Dieses Muster ist leistungsfähig, weil das Discountable-Trait von jeder Klasse verwendet werden kann – von Produkten, Diensten und Abonnements –, solange sie getBasePrice() implementieren. Das Trait stellt die gemeinsame Rabattlogik bereit, während jede Klasse definiert, woher ihr Grundpreis stammt.

Probier es selbst

<?php

require_once 'Product.php';

// Eingaben lesen
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$discountPercent = intval(trim(fgets(STDIN)));

// TODO: Erstelle eine Product-Instanz mit dem Namen und dem Preis

// TODO: Gib den Basispreis formatiert als "Base: $[price]" mit 2 Dezimalstellen aus

// TODO: Gib das Ergebnis des Aufrufs von getFinalPrice() mit dem Rabattprozentsatz aus

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

Übe selbstständig: Online-PHP-Compiler