6. Juni 2016 | 1 Comment Hallo zusammen! Heute möchte ich euch zeigen, wie man anhand eines einfachen Traits aus jeder beliebigen Klasse ein Singleton machen kann. Traits sind eine hervorragende Methode um vorhandenen Code ohne großen Aufwand wiederzuverwenden. Falls ihr wissen möchtet was Traits genau sind, schaut euch meinen Eintrag vom März 2012 an! Ein Singleton via Trait definieren Ganz im Sinne von DRY möchten wir möglichst keinen Code doppelt schreiben, denn doppelter Code bedeutet auch gleichzeitig doppelte Komplexität, Fehleranfälligkeit, Ressourcenaufwand und Speicherplatz. Alles Dinge, die wir vermeiden möchten 🙂 Also wie sieht so ein Trait im Code aus? trait Singleton { private static $instance = null; public static function instance() { if (self::$instance === null) { self::$instance = new static; } // if return self::$instance; } // function } // trait Super einfach, oder? Das ganze sieht aus wie ein Singleton-Pattern Prototyp, von dem nun sämtliche Klassen erben könnten. Aber das möchten wir nicht, dadurch würde die Vererbungskette nämlich nur unnötig lang werden. Wir übergeben unseren gewünschten Klassen nun also den Trait… Mit Hilfe von use: class Car { use Singleton; private $company; private $model; public function setCompany($company) { $this->company = $company; return $this; } // function // [...] } // class // Use like... $car = Car::instance()->setCompany("VW"); Unsere Car Klasse kann nun mit Hilfe von instance() Mühelos instanziiert werden! Den Trait können wir natürlich noch in beliebig vielen anderen Klassen wiederverwenden – jede wird anschließend die singleton() Methode mitliefern und uns Code sparen! Was lässt sich noch mit Traits machen? Das Singleton-Pattern ist ja bekanntlich nur eines von vielen – wir könnten entsprechend noch andere Traits erstellen, zum Beispiel für das Factory- oder Registry-Pattern! Im Grunde lässt sich jeder Code in ein Trait auslagern und mit anderen Klassen teilen, das ist ein geniales Konzept 🙂 Was mich nun interessiert: wofür habt ihr schon Traits eingesetzt? Oder ist dieses Konstrukt komplett neu für euch? Ich hoffe ich konnte euch etwas neues und interessantes zeigen… Genießt die Woche bei sommerlichen Temperaturen! Wir sehen uns beim nächsten Posting. Und bis dahin wünsche ich euch Happy Coding!
Guter Tipp! Singletons braucht man ja doch immer wieder, das erspart einem immer den gleichen Code. Danke dafür! Antworten