
Druckansicht von http://www.php-homepage.de/manual/language.oop5.traits.php
TraitsSeit PHP 5.4.0 gibt es in PHP eine Methode der Wiederverwendung von Code, die Traits genannt wird. Traits ist ein Mechanismus zur Wiederverwendung von Code, der in Programmiersprachen mit einfacher Vererbung wie PHP verwendet wird. Ein Trait kann verwendet werden die Beschränkungen der einfachen Vererbung aufzuweichen indem er erlaubt, dass Mengen von Methoden frei in mehreren unabhängigen Klassen die in verschiedenen Klassenhierarchien stecken wiederzuverwenden. Die Semantik der Kombination von Traits und Klassen ist so definiert, dass die Komplexität reduziert wird und die üblichen Probleme vermeidet, die mit Mehrfachvererbung und Mixins in Verbindung gebracht werden. Ein Trait hat Ähnlichkeit mit einer Klasse ist aber nur dafür vorgesehen Funktionalität in einer feingranularen und konsistenten Art und Weise zu bündeln. Es ist nicht möglich einen Trait alleinstehend zu instantiieren. Es handelt sich um einen Zusatz zur traditionellen Vererbung und erlaubt horizontale Komposition von Verhaltensweisen, d.h. die Verwendung von Klassenmethoden ohne Vererbung vorauszusetzen. Beispiel #1 Trait Beispiel
<?phpRangfolgeMethoden der aktuellen Klasse überschreiben Methoden, welche von Traits definiert wurden. Jene wiederum überschreiben von Elternklassen geerbte Methoden. Beispiel #2 Rangfolge Beispiel Die Methode sayHello der Basisklasse wird durch die gleichnamige Methode aus dem Trait überschrieben.
<?phpDas oben gezeigte Beispiel erzeugt folgende Ausgabe: Hallo Welt! Beispiel #3 Weiteres Beispiel für Rangfolge
<?phpDas oben gezeigte Beispiel erzeugt folgende Ausgabe: Hallo Universum! Mehrere TraitsMehrere Traits können durch eine kommaseparierte Auflistung im Use- Statement zu einer Klasse hinzugefügt werden. Beispiel #4 Verwendung mehrerer Traits
<?phpDas oben gezeigte Beispiel erzeugt folgende Ausgabe: Hallo Welt! KonfliktauflösungFalls zwei Traits eine Methode mit gleichem namen einfügen, so wird ein Fatal Error erzeugt, wenn der Konflikt nicht explizit aufgelöst wird. Um einen Namenskonflikt zwischen Traits in der gleichen Klasse aufzulösen muss der insteadof-Operator verwendet werden, um genau eine der Methoden des Konflikts auszuwählen. Da dies es nur erlaubt Methoden auszuschließen kann der as-Operator verwendet werden, um eine der Methoden des Konflikts wieder unter einem anderen Namen hinzuzufügen. Beispiel #5 Konfliktauflösung In diesem Beispiel verwendet die Klasse Talker die Traits A und B. Nachdem A und B sich widersprechende Methoden besitzen definiert die Klasse, dass sie die Variante von smallTalk aus dem Trait B und die Variante von bigTalk des Traits A verwenden möchte. Die Klasse Aliased_Talker verwendet den as-Operator, damit sie außerdem die Implementierung der bigTalk-Methode von B unter dem Alias talk verwenden kann.
<?phpVeränderung der Sichtbarkeit von MethodenMit der as-Syntax ist es ebenso möglich, die Sichtbarkeit einer Methode in der darstellenden Klasse zu verändern. Beispiel #6 Veränderung der Sichtbarkeit von Methoden
<?phpTrait-Zusammensetzung aus TraitsEbenso wie Klassen können auch traits andere Traits verwenden. Indem man einen oder mehrere Traits in einer Traitdefinition verwendet kann man Traits entweder teilweise oder vollständig aus Methoden, welche in anderen Traits definiert sind, zusammensetzen. Beispiel #7 Trait-Zusammensetzung aus Traits
<?phpDas oben gezeigte Beispiel erzeugt folgende Ausgabe: Hallo Welt! Abstrakte TraitmemberTraits unterstützen auch die Verwendung von abstrakten Methoden, um darstellenden Klassen Anforderungen aufzudrängen. Beispiel #8 Ausdrücken von Anforderungen durch abstrakte Methoden
<?phpStatische TraitmemberInnerhalb von Traits kann auf statische Variablen zugegriffen werden, aber diese können nicht in Traits definiert werden. Statische Methoden können hingegen auch durch Traits für die darstellende Klasse definiert werden. Beispiel #9 Statische Variablen
<?phpBeispiel #10 Statische Methoden
<?phpAttributeTraits können ebenfalls Attribute definieren. Beispiel #11 Attribute definieren
<?php
Ein Attribut, welches durch einen Trait definiert wurde, kann nicht von der
Klasse erneut definiert werden. Wenn die Attribute kompatibel sind, d.h. die selbe
Sichtbarkeit und den selben Standardwert besitzen, wird ein Beispiel #12 Konfliktauflösung
<?php |