php: Trait me well…

Ich beschäftige mich jetzt schon Jahrzehnte mit php, angefangen habe ich tatsächlich mit php3.x. Die Entwicklung hat in dieser Zeit enorme Höhenflüge erreicht, angefangen mit den ersten vorsichtigen Schritte in Richtung OOP bis zu dessen (fast vollständigen) Implementierung in den aktuellen Versionen. Zu den Neuerungen in php 7.x werde ich aber einen gesonderten Blogeintrag machen 😉

Das Thema dieses Artikels sind die seit php5.x vorhandenen aber irgendwie komplett an mir vorbeigegangenen “traits“. Diese stellen quasi eine Art “Sammlung” von Methoden dar, die man sehr einfach in eigene Klassen und somit Objekte integrieren kann.

Wer sich mit OOP befasst, landet früher oder später bei der Vererbung von Klassen. Es sei jetzt dahingestellt, ob man dies relativ simple mit “extends” realisiert und so eine relativ einfache Form der Mehrfachvererbung durchführt

Klasse1
  Hier die Methoden der Klasse1  

Klasse2 extends Klasse1
  Klasse 2 hat nun alle Methoden aus Klasse1 und die eigenen...

Klasse3 extends Klasse2
  Klasse 3 hat nun alle Methoden aus Klasse1, Klasse2 und die eigenen...

 

Was natürlich aber immer existiert ist eine u.U. sehr lange Verkettung der einzelnen Klassen, die nicht immer einfach einsehbar ist (wenn man kein sinnvolles Tool zum Entwickeln einsetzt).

Etwas eleganter ist die Benutzung sogenannter traits :

trait Trait1
  methodeTrait1

trait Trait2
  methodeTrait2

Klasse
  use Trait1, Trait2
  // Hier können nun die Methoden beider Traits wie eigene benutzt werden.
  $this->methodeTrait1();
  $this->methodeTrait2();

 

Somit ist es elegant möglich, kleinere Funktionsblöcke in traits zu kapseln und diese dann nach Belieben zu kombinieren. Ich bin mittlerweile ein ganz großer Fan von Traits, weil es so sehr einfach möglich ist, minimale Funktionalität zu kapseln und diese immer wieder zu optimieren, zu verbessern und dann ganz einfach diese den “using classes” zur Verfügung zu stellen. Aktuell arbeite ich privat an einer Art IFTTT-Clone der mit einige wichtige Informationen zusammensammelt und grafisch aufbereitet.

Basis des Ganzen ist ein “Service” Object, das alle benötigten Methoden, Eigenschaften und deren Getter und Setter zur Verfügung stellt. Da das Ganze langsam sehr groß und unübersichtlich wurde habe ich die Klasse dann in 5 Traits aufgesplittet. Jedes ist für einen Teilbereich zuständig: Service_Config, Service_Cache. Service_Params, Service_Information und Service_Output.
So halte ich den Codewust der einzelnen Traits klein, kann diese in der Basisklasse einfach benutzen.

Zusammen mit dem in php7.x eingeführten Typehinting schafft man sich eine sehr stabile Codebasis, die einige Unittests fast überflüssig macht. Denn warum sollte ich noch prüfen, wie eine Funktion reagiert, wenn man ihr falsche Parameter übergibt?

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.