
Du fragst dich, wann du einen Trait anlegen solltest, und was dafür und dagegen spricht? Oder du weißt schlicht noch nicht, was ein Trait in PHP überhaupt ist – in dem Fall lies zuerst den Artikel, den ich dazu geschrieben habe.
Bei mir gab es nur selten Anlass, einen Trait zu schreiben: bei Widgets für Elementor oder Prestashop. Ein Elementor-Widget erbt zum Beispiel bereits von einer Klasse. Ich habe wenig Lust, dafür eine Klasse zu bauen, die von einer anderen erbt, die wiederum von einer anderen erbt, nur um zwei oder drei Methoden gemeinsam zu nutzen. Genau da kommt der Trait ins Spiel und erlaubt mir, diese Methoden zu teilen. Vereinfacht gesagt läuft ein Trait auf ein Copy-and-paste hinaus.
trait CarouselTrait
{
public function getScriptDepends()
{
return ['swiper'];
}
protected function registerCarouselSection(array $args = [])
{
// Restlicher Code für die Anzeige der
// Konfigurationsoptionen in Elementor
}
}
Die Vorteile eines Traits in PHP
-
Willst du Code zwischen mehreren Klassen wiederverwenden, ist ein Trait eine Alternative dazu, die Klasse zu erweitern. Oft ist er sogar die bessere Wahl, weil er nicht zur Typhierarchie gehört: Eine Klasse, die einen Trait nutzt, ist keine „Instanz dieses Traits“.
-
Ein Trait erspart dir das Copy-and-paste von Hand, indem er es zur Kompilierzeit übernimmt.
Die Nachteile eines Traits in PHP
Auf der anderen Seite bringen Traits gleich mehrere Probleme mit. Zum Beispiel:
-
Fügt ein Trait einer Klasse eine oder mehrere öffentliche Methoden hinzu, willst du diese Methoden oft als Interface festhalten, das die Klasse durch das Einbinden des Traits automatisch implementiert. Das geht nicht. Ein Trait kann kein Interface implementieren. Du bindest also den Trait ein und implementierst das Interface zusätzlich von Hand, wenn du dorthin willst.
-
Traits haben keine eigenen „privaten“ Methoden und Eigenschaften. Ich verstecke gern das eine oder andere vor der Klasse, in der der Trait steckt, aber „privat“ gibt es hier nicht. Alles, was im Trait als privat deklariert ist, bleibt für die einbindende Klasse erreichbar. Ein Trait kann also nichts kapseln.
Welche Alternativen es zu Traits in PHP gibt
In der Praxis findet sich ohnehin fast immer eine Alternative zum Trait. Ein paar Beispiele:
-
Hat der Trait die Aufgaben eines Service, machst du besser einen echten Service daraus, den du dem Service, der ihn braucht, als Konstruktor-Argument injizierst. Das nennt sich zusammengesetztes Verhalten (composing behavior) statt geerbtes Verhalten. Derselbe Ansatz hilft dir auch, wenn du Elternklassen loswerden willst.
-
Fügt der Trait einer Entität ein Verhalten hinzu, das eine andere Entität genauso braucht, lohnt sich an seiner Stelle meist ein Value Object in PHP.
Fazit
Traits sind für mich ein bequemer Ausweg. Sie ordnen eher den Code, statt Codezeilen zu duplizieren oder Vererbungen ineinander zu schachteln.


