Rolf B: In welchem Bereich sind Traits nützlich?

Beitrag lesen

Hallo MB,

ich habe schon mehrfach zu Antworten angesetzt, aber wirklich raten kann ich Dir nicht. Traits sind in meinem Wissensspektrum ein spezielles PHP Konstrukt, das ich sonst nirgends kenne. Was PL in seinem Perl-Blog als Trait bezeichnet, ist eine reduzierte Form der PHP Traits, eher sowas wie ein include einer Datei mit Klassenfragmenten, die man nach Bedarf hinzuladen kann.

Rein technisch ist es möglich, einen Trait zu schreiben der kreuz und quer auf die Methoden und Eigenschaften des Objektes zugreift, das ihn einbindet. Genauso kann das Objekt kreuz und quer auf den Trait zugreifen. Und warum auch nicht? Sobald Du den Trait mit use einbindest, gehst Du davon aus, dass Klasse und Trait nur zusammen glücklich werden können. Einzeln wird keiner von beiden mehr was.

Du kannst Dir aber auch gezielt Zurückhaltung auferlegen, und Traits einsetzen

  • wie eine zusätzliche abstrakte Basisklasse, von der man erben kann (in dem Fall greift nur die use-nde Klasse auf den Trait zu). Eine andere Sicht auf diese Verwendung wäre der Trait als Default-Implementierung eines Interface, das von einer Klasse implementiert werden soll.
  • wie eine Subklasse, die deine Klasse erweitert (nur der Trait greift auf Elemente der use-nden Klasse zu)

Gerade in Frameworks macht man es gerne mal so, dass Methoden der Basisklassen abstrakte Methoden der Basisklasse aufrufen, die dann von der Subklasse zu überschreiben sind, um die für diese Subklasse spezifische Funktionalität beizusteuern. Das kannst Du bei einem Trait auch machen, auch dort gibt es abstrakte Methoden. Wer diesen Trait einbindet, muss dann die abstrakte Methode implementieren. Diese Form der Koppelung ist dann gewollt und auch nicht schlimm - Traits brauchen immer eine andere Klasse als Wirt, sie sind nicht eigenständig nutzbar und nicht eigenständig testbar (außer mit einem Test-Wirt).

Du fragst nach Konventionen. Kennst Du die PSR? Das ist das, was einer Sammlung von Konventionen in PHP am nächsten kommt, aber über Traits schreiben sie nur Formalien (in PSR-12), die Dir wenig nützen. Man kann auch nicht wirklich von anderen Sprachen abschauen, weil Traits in dieser Form eine PHP Spezialität sind (abgesehen von dem gleichnamigen Dings in C++, das aber etwas anderes ist).

Wenn Du feststellst, dass ein Trait eigentlich ein eigenständiges Objekt sein könnte, dann ist es vermutlich am besten, das auch so zu implementieren und auf Objektkomposition zurückzugreifen, statt auf das usen von Traits.

Wenn Du Dich mit einem Trait unwohl fühlst, dann höre auf deinen Bauch und mach keinen.

Rolf - der möglicherweise komplett falsch liegt 😀

--
sumpsi - posui - clusi