Menu
Coddy logo textTech

Mehrere Traits verwenden

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

Ein einzelnes Trait ist nützlich, aber die wahre Stärke zeigt sich, wenn du mehrere Traits in einer Klasse kombinierst. PHP ermöglicht es dir, so viele Traits einzubinden, wie du benötigst, sodass deine Klasse gleichzeitig Fähigkeiten aus mehreren Quellen erhält.

Um mehrere Traits zu verwenden, liste sie einfach durch Kommas getrennt nach dem Schlüsselwort use auf:

<?php
trait Timestampable {
    public function getTimestamp(): string {
        return date('Y-m-d H:i:s');
    }
}

trait Identifiable {
    private string $id;
    
    public function generateId(): void {
        $this->id = uniqid('id_');
    }
    
    public function getId(): string {
        return $this->id;
    }
}

class Post {
    use Timestampable, Identifiable;
    
    public function __construct(public string $title) {
        $this->generateId();
    }
}

$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();

Ausgabe:

id_6789abc123 - 2024-01-15 10:30:00

Die Klasse Post verfügt nun über Methoden aus beiden Traits. Jeder Trait trägt seine eigene Funktionalität bei – Timestampable stellt zeitbezogene Methoden bereit, während Identifiable eindeutige IDs verwaltet. Dieser Ansatz hält jeden Trait auf eine einzige Verantwortung fokussiert und macht deinen Code dadurch modularer und wiederverwendbarer.

Was passiert, wenn zwei Traits Methoden mit demselben Namen haben? Das ist eine Konfliktsituation, die wir in der nächsten Lektion untersuchen werden.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Produktverwaltungssystem, das mehrere Traits kombiniert, um Produkten sowohl Preis- als auch Bestandsfunktionen zu geben. Jeder Trait übernimmt eine einzelne Verantwortung, und deine Produktklasse erhält Funktionalität von beiden.

Du organisierst deinen Code über drei Dateien:

  • Priceable.php: Erstelle einen Trait namens Priceable, der die Preisfunktionalität übernimmt. Der Trait sollte Folgendes enthalten:
    • Eine private Eigenschaft $price (Gleitkommazahl)
    • Eine Methode setPrice(float $price), die den Preis speichert
    • Eine Methode getPrice(), die den Preis zurückgibt
    • Eine Methode getFormattedPrice(), die den Preis als "$[price]" mit 2 Dezimalstellen formatiert zurückgibt
  • Stockable.php: Erstelle einen Trait namens Stockable, der den Bestand verwaltet. Der Trait sollte Folgendes enthalten:
    • Eine private Eigenschaft $stock (Ganzzahl)
    • Eine Methode setStock(int $quantity), die die Bestandsmenge speichert
    • Eine Methode getStock(), die den aktuellen Bestand zurückgibt
    • Eine Methode isInStock(), die true zurückgibt, wenn der Bestand größer als 0 ist, andernfalls false
  • main.php: Binde beide Trait-Dateien ein und erstelle eine Product-Klasse, die sowohl die Traits Priceable als auch Stockable verwendet. Verwende Constructor Promotion, um eine öffentliche Eigenschaft $name zu definieren. Der Konstruktor sollte außerdem einen Preis und eine Bestandsmenge akzeptieren und die Trait-Methoden verwenden, um diese festzulegen.

    Du erhältst drei Eingaben: einen Produktnamen, einen Preis und eine Bestandsmenge. Erstelle ein Produkt mit diesen Werten und gib vier Zeilen aus:

    • Den Produktnamen
    • Den formatierten Preis (unter Verwendung von getFormattedPrice())
    • Die Bestandsmenge
    • "Available", wenn das Produkt auf Lager ist, oder "Out of stock", wenn es nicht auf Lager ist

Dies zeigt, wie mehrere Traits zusammenarbeiten. Deine Product-Klasse erhält von einem Trait Preisfunktionen und von einem anderen die Bestandsverwaltung. Dabei bleibt jeder Verantwortungsbereich sauber getrennt, während beide zu einem voll ausgestatteten Produkt kombiniert werden.

Probier es selbst

<?php
require_once 'Priceable.php';
require_once 'Stockable.php';

// TODO: Erstelle eine Product-Klasse, die sowohl die Priceable- als auch die Stockable-Traits verwendet
// Verwende Constructor Promotion für die öffentliche $name-Eigenschaft
// Der Konstruktor sollte name, price und stock akzeptieren und Trait-Methoden verwenden, um price und stock zu setzen

class Product {
    // TODO: Verwende die Traits hier

    // TODO: Implementiere den Konstruktor mit Constructor Promotion für $name
    // und setze price und stock mit Trait-Methoden
}

// Eingabe lesen
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));

// TODO: Erstelle eine Product-Instanz mit den Eingabewerten

// TODO: Gib den Produktnamen aus
// TODO: Gib den formatierten Preis mit getFormattedPrice() aus
// TODO: Gib die Lagermenge aus
// TODO: Gib "Available" aus, wenn auf Lager, oder "Out of stock" wenn nicht
?>
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