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.
Aufgabe
EinfachLassen 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 namensGreetable, 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
- Eine private Eigenschaft
Person.php— Erstellen Sie eine KlassePerson, die den TraitGreetableverwendet. Binden Sie die Trait-Datei ein und nutzen Sie Constructor Promotion, um eine öffentliche Eigenschaft$namezu definieren. Rufen Sie im KonstruktorsetGreeting()auf, um die Begrüßung auf"Hello, I'm $name"zu setzen.Robot.php— Erstellen Sie eine KlasseRobot, die ebenfalls den TraitGreetableverwendet. Binden Sie die Trait-Datei ein und nutzen Sie Constructor Promotion, um eine öffentliche Eigenschaft$modelzu definieren. Rufen Sie im KonstruktorsetGreeting()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)
?>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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung