Hallo MB,
Traits sind dazu da, in beliebige Klassen eingemixt zu werden. Darum sollen sie über ihren Nutzer nichts wissen.
Dieses Wissen kannst Du konkretisieren, wenn der Trait eine abstrakte Methode definiert.
trait Logger {
abstract function GetPrefix();
function Log($message) {
echo GetPrefix() . $message;
}
}
Eine Klasse, die den Logger-Trait einbindet, muss eine Methode GetPrefix implementieren und kann damit z.B. ihren Namen als Prefix für Lognachrichten liefern (ja, ich weiß, mit get_class ginge das auch).
Was technisch geht, aber aus Sicht von Software Engineering keine gute Idee ist, ist das Verwenden von $this. Der Trait gilt als Teil der Klasse und kann deshalb auf allem herumturnen, was in $this zu finden ist, private oder nicht, egal ob aus dem Trait stammend oder der Hostklasse. Das würde ich aber als OOS[1] bezeichnen. Traits sind dazu gedacht, entkoppelt und überall nutzbar zu sein. Dass die Host-Klasse ein paar abstrakte Methoden bereitstellen muss, das geht noch, das ist auch in der Sprache so vorgesehen. Aber ein Trait sollte keine unterschwelligen Annahmen treffen, dass die Hostklasse bestimmte Eigenschaften oder Methoden besitzt.
Versuche mal, ob Du mit abstract functions etwas erreichen kannst. Andernfalls könnte es sein, dass Traits nicht das richtige Werkzeug sind. Statt dessen könntest Du Worker-Objekte einsetzen, die von der Hostklasse erzeugt werden und deren Konstruktor ein Interface erwartet, das die Hostklasse implementiert (übergib nicht das $this der Hostklasse. Dann droht wieder OOS).
Rolf
sumpsi - posui - clusi
Objektorientierter Spaghetticode ↩︎