Menu
Coddy logo textTech

Verwendung mehrerer Traits

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 man mehrere Traits in einer Klasse kombiniert. PHP ermöglicht es Ihnen, so viele Traits einzubinden, wie Sie benötigen, wodurch Ihre Klasse Fähigkeiten aus mehreren Quellen gleichzeitig erhält.

Um mehrere Traits zu verwenden, listen Sie diese 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 bietet zeitbezogene Methoden, während Identifiable eindeutige IDs verwaltet. Dieser Ansatz sorgt dafür, dass jeder Trait auf eine einzige Verantwortlichkeit konzentriert bleibt, was Ihren Code modularer und wiederverwendbarer macht.

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

Lassen Sie uns ein Produktmanagementsystem erstellen, das mehrere Traits kombiniert, um Produkten sowohl Preis- als auch Bestandsfunktionen zu verleihen. Jeder Trait übernimmt eine einzelne Aufgabe, und Ihre Produktklasse erhält die Funktionalität von beiden.

Sie werden Ihren Code über drei Dateien organisieren:

  • Priceable.php — Erstellen Sie einen Trait namens Priceable, der die Preisfunktionalität verwaltet. Der Trait sollte Folgendes enthalten:
    • Eine private Eigenschaft $price (float)
    • Eine Methode setPrice(float $price), die den Preis speichert
    • Eine Methode getPrice(), die den Preis zurückgibt
    • Eine Methode getFormattedPrice(), die den Preis formatiert als "$[price]" mit 2 Dezimalstellen zurückgibt
  • Stockable.php — Erstellen Sie einen Trait namens Stockable, der den Bestand verwaltet. Der Trait sollte Folgendes enthalten:
    • Eine private Eigenschaft $stock (integer)
    • 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 — Binden Sie beide Trait-Dateien ein und erstellen Sie eine Klasse Product, die sowohl den Trait Priceable als auch den Trait Stockable verwendet. Nutzen Sie 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 zu setzen.

    Sie erhalten drei Eingaben: einen Produktnamen, einen Preis und eine Bestandsmenge. Erstellen Sie ein Produkt mit diesen Werten und geben Sie vier Zeilen aus:

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

Dies zeigt, wie mehrere Traits zusammenarbeiten — Ihre Klasse Product erhält Preisfunktionen von einem Trait und Bestandsverwaltung von einem anderen, wodurch jede Aufgabe sauber getrennt bleibt, während sie 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 Priceable- als auch 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 mithilfe von 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