Menu
Coddy logo textTech

Einführung in Traits

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

PHP unterstützt nur einfache Vererbung – eine Klasse kann nur eine einzige Elternklasse erweitern. Aber was ist, wenn Sie Funktionalität über mehrere nicht verwandte Klassen hinweg teilen müssen? Hier kommen traits ins Spiel.

Ein Trait ist ein Mechanismus zur Wiederverwendung von Code, mit dem Sie Methoden und Eigenschaften definieren können, die in mehrere Klassen eingefügt werden können. Betrachten Sie Traits als Copy-and-Paste auf Sprachebene – der Code eines Traits wird Teil der Klasse, die ihn verwendet.

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

$article = new Article("PHP Traits");
echo $article->getCreatedAt();

Das Schlüsselwort use innerhalb einer Klasse importiert die Member des Traits. Jetzt hat Article Zugriff auf setCreatedAt() und getCreatedAt(), als wären sie direkt in der Klasse definiert worden.

Derselbe Trait kann in völlig voneinander unabhängigen Klassen verwendet werden – einer Comment-Klasse, einer User-Klasse oder jeder anderen Klasse, die Zeitstempel-Funktionalität benötigt. Dies löst die Einschränkung der einfachen Vererbung, indem es den horizontalen Austausch von Code über Ihre Klassenhierarchie hinweg ermöglicht.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein einfaches Begrüßungssystem erstellen, das zeigt, wie Traits es ermöglichen, Funktionalitäten über nicht verwandte Klassen hinweg zu teilen. Sie werden einen Trait erstellen, der eine Begrüßungsfunktion bereitstellt, und diesen dann in zwei völlig unterschiedlichen Klassen verwenden.

Sie werden Ihren Code über drei Dateien organisieren:

  • Greetable.php — Erstellen Sie einen Trait namens Greetable, der eine Begrüßungsfunktionalität bietet. Der Trait sollte Folgendes enthalten:
    • Eine private Eigenschaft $greeting (string)
    • Eine Methode setGreeting(string $greeting), die die Begrüßungsnachricht speichert
    • Eine Methode greet(), die die Begrüßungsnachricht zurückgibt
  • Person.php — Erstellen Sie eine Klasse Person, die den Trait Greetable verwendet. Binden Sie die Trait-Datei ein und nutzen Sie Constructor Promotion, um eine öffentliche Eigenschaft $name zu definieren. Rufen Sie im Konstruktor setGreeting() auf, um die Begrüßung auf "Hello, I'm $name" zu setzen.
  • Robot.php — Erstellen Sie eine Klasse Robot, die ebenfalls den Trait Greetable verwendet. Binden Sie die Trait-Datei ein und nutzen Sie Constructor Promotion, um eine öffentliche Eigenschaft $model zu definieren. Rufen Sie im Konstruktor setGreeting() auf, um die Begrüßung auf "Beep boop, I am model $model" zu setzen.

In main.php binden Sie beide Klassendateien ein. Sie erhalten zwei Eingaben: den Namen einer Person und die Modellnummer eines Roboters. Erstellen Sie Instanzen beider Klassen und geben Sie deren Begrüßungen in separaten Zeilen aus.

Dies demonstriert die Stärke von Traits — Person und Robot sind völlig unverbundene Klassen ohne gemeinsamen Elternteil, dennoch erhalten beide dieselbe Begrüßungsfunktionalität durch den Trait. Jede Klasse passt die Nutzung dieser Funktionalität auf ihre eigene Weise an.

Spickzettel

Ein Trait ist ein Mechanismus zur Codewiederverwendung, der es Ihnen ermöglicht, Methoden und Eigenschaften über mehrere nicht verwandte Klassen hinweg zu teilen, wodurch die Einschränkung der einfachen Vererbung in PHP gelöst wird.

Definieren Sie einen Trait mit dem Schlüsselwort trait:

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

Verwenden Sie einen Trait in einer Klasse mit dem Schlüsselwort use:

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

Die Methoden und Eigenschaften des Traits werden Teil der Klasse, als wären sie direkt darin definiert worden. Mehrere nicht verwandte Klassen können denselben Trait verwenden, um Funktionalität horizontal über Ihre Klassenhierarchie hinweg zu teilen.

Probier es selbst

<?php

require_once 'Person.php';
require_once 'Robot.php';

// Eingabe lesen
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));

// TODO: Erstellen Sie eine Person-Instanz mit dem angegebenen Namen
// TODO: Erstellen Sie eine Robot-Instanz mit dem angegebenen Modell
// TODO: Geben Sie die Begrüßung der Person aus
// TODO: Geben Sie die Begrüßung des Roboters aus (in einer neuen Zeile)

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