Einführung in Traits
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 51 von 91.
PHP unterstützt nur die einfache Vererbung – eine Klasse kann nur eine übergeordnete Klasse erweitern. Aber was ist, wenn du Funktionalität über mehrere voneinander unabhängige Klassen hinweg gemeinsam nutzen musst? Hier kommen Traits ins Spiel.
Ein Trait ist ein Mechanismus zur Wiederverwendung von Code, mit dem du Methoden und Eigenschaften definieren kannst, die in mehrere Klassen eingefügt werden können. Stell dir Traits als Copy-and-paste auf Sprachebene vor – der Code aus einem Trait wird zu einem 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 Mitglieder des Traits. Nun hat Article Zugriff auf setCreatedAt() und getCreatedAt(), als wären sie direkt in der Klasse definiert.
Dasselbe Trait kann in völlig unterschiedlichen Klassen verwendet werden – einer Comment-Klasse, einer User-Klasse oder jeder anderen Klasse, die eine Zeitstempelfunktionalität benötigt. Dadurch wird die Einschränkung der einfachen Vererbung gelöst, indem der horizontale Codeaustausch innerhalb deiner Klassenhierarchie ermöglicht wird.
Aufgabe
EinfachErstellen wir ein einfaches Begrüßungssystem, das demonstriert, wie Traits es dir ermöglichen, Funktionalität zwischen voneinander unabhängigen Klassen zu teilen. Du erstellst einen Trait, der eine Begrüßungsfunktion bereitstellt, und verwendest ihn anschließend in zwei völlig unterschiedlichen Klassen.
Du organisierst deinen Code über drei Dateien:
Greetable.php: Erstelle einen Trait namensGreetable, der Begrüßungsfunktionalität bereitstellt. 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
- Eine private Eigenschaft
Person.php: Erstelle einePerson-Klasse, die denGreetable-Trait verwendet. Binde die Trait-Datei ein und verwende Konstruktor-Promotion, um eine öffentliche Eigenschaft$namezu definieren. Rufe im KonstruktorsetGreeting()auf, um die Begrüßung auf"Hello, I'm [name]"zu setzen.Robot.php: Erstelle eineRobot-Klasse, die ebenfalls denGreetable-Trait verwendet. Binde die Trait-Datei ein und verwende Konstruktor-Promotion, um eine öffentliche Eigenschaft$modelzu definieren. Rufe im KonstruktorsetGreeting()auf, um die Begrüßung auf"Beep boop, I am model [model]"zu setzen.
Binde in main.php beide Klassendateien ein. Du erhältst zwei Eingaben: den Namen einer Person und die Modellnummer eines Roboters. Erstelle Instanzen beider Klassen und gib ihre Begrüßungen in separaten Zeilen aus.
Dies demonstriert die Leistungsfähigkeit von Traits: Person und Robot sind völlig voneinander unabhängige Klassen ohne gemeinsamen Elternteil, erhalten jedoch beide durch den Trait dieselbe Begrüßungsfunktionalität. Jede Klasse passt die Verwendung dieser Funktionalität auf ihre eigene Weise an.
Probier es selbst
<?php
require_once 'Person.php';
require_once 'Robot.php';
// Eingabe lesen
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));
// TODO: Erstelle eine Person-Instanz mit dem gegebenen Namen
// TODO: Erstelle eine Robot-Instanz mit dem gegebenen Modell
// TODO: Gib die Begrüßung der Person aus
// TODO: Gib die Begrüßung des Robots aus (in einer neuen Zeile)
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler