Traits

In PHP gibt es eine Methode der Wiederverwendung von Code, die Traits genannt wird.

Traits sind ein Mechanismus zur Wiederverwendung von Code, der in Programmiersprachen mit einfacher Vererbung wie PHP verwendet wird. Ein Trait kann verwendet werden, um den Beschränkungen der einfachen Vererbung auszuweichen, 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

<?php
trait ezcReflectionReturnInfo {
    function 
getReturnType() { /*1*/ }
    function 
getReturnDescription() { /*2*/ }
}

class 
ezcReflectionMethod extends ReflectionMethod {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}

class 
ezcReflectionFunction extends ReflectionFunction {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}
?>

Rangfolge

Methoden 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.

<?php
class Base {
    public function 
sayHello() {
        echo 
'Hallo ';
    }
}

trait 
SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'Welt!';
    }
}

class 
MyHelloWorld extends Base {
    use 
SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Hallo Welt!

Beispiel #3 Weiteres Beispiel für Rangfolge

<?php
trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hallo Welt!';
    }
}

class 
TheWorldIsNotEnough {
    use 
HelloWorld;
    public function 
sayHello() {
        echo 
'Hallo Universum!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Hallo Universum!

Mehrere Traits

Mehrere Traits können durch eine kommaseparierte Auflistung im use-Statement zu einer Klasse hinzugefügt werden.

Beispiel #4 Verwendung mehrerer Traits

<?php
trait Hello {
    public function 
sayHello() {
        echo 
'Hallo ';
    }
}

trait 
World {
    public function 
sayWorld() {
        echo 
' Welt';
    }
}

class 
MyHelloWorld {
    use 
HelloWorld;
    public function 
sayExclamationMark() {
        echo 
'!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Hallo Welt!

Konfliktauflösung

Falls 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 einen Alias zu einer der Methoden hinzuzufügen. Es ist zu beachten, dass der as Operator die Methode nicht umbenennt, und auch keine andere Methode beeinflusst.

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.

<?php
trait {
    public function 
smallTalk() {
        echo 
'a';
    }
    public function 
bigTalk() {
        echo 
'A';
    }
}

trait 
{
    public function 
smallTalk() {
        echo 
'b';
    }
    public function 
bigTalk() {
        echo 
'B';
    }
}

class 
Talker {
    use 
A{
        
B::smallTalk insteadof A;
        
A::bigTalk insteadof B;
    }
}

class 
Aliased_Talker {
    use 
A{
        
B::smallTalk insteadof A;
        
A::bigTalk insteadof B;
        
B::bigTalk as talk;
    }
}
?>

Veränderung der Sichtbarkeit von Methoden

Mit 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

<?php
trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hallo Welt!';
    }
}

// Ändern der Sichtbarkeit von sayHello
class MyClass1 {
    use 
HelloWorld sayHello as protected; }
}

// Alias der Methode mit geänderter Sichtbarkeit
// Die Sichtbarkeit von sayHello bleibt unverändert
class MyClass2 {
    use 
HelloWorld sayHello as private myPrivateHello; }
}
?>

Trait-Zusammensetzung aus Traits

Ebenso 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

<?php
trait Hello {
    public function 
sayHello() {
        echo 
'Hallo ';
    }
}

trait 
World {
    public function 
sayWorld() {
        echo 
'Welt!';
    }
}

trait 
HelloWorld {
    use 
HelloWorld;
}

class 
MyHelloWorld {
    use 
HelloWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Hallo Welt!

Abstrakte Traitmember

Traits unterstützen auch die Verwendung von abstrakten Methoden, um darstellenden Klassen Anforderungen vorzugeben. Es werden öffentliche, geschützte und private Methoden unterstützt. Vor PHP 8.0.0 wurden nur öffentliche und geschützte abstrakte Methoden unterstützt.

Achtung

Eine konkrete Klasse erfüllt die Anforderungen durch die Definition einer konkreten Methode mit dem selben Namen; deren Signatur kann sich unterscheiden.

Beispiel #8 Ausdrücken von Anforderungen durch abstrakte Methoden

<?php
trait Hello {
    public function 
sayHelloWorld() {
       echo 
'Hallo'.$this->getWorld();
    }
    abstract public function 
getWorld();
}

class 
MyHelloWorld {
    private 
$world;
    use 
Hello;
    public function 
getWorld() {
        return 
$this->world;
    }
    public function 
setWorld($val) {
        
$this->world $val;
    }
}
?>

Statische Traitmember

Traits unterstützen sowohl statische Variablen, statische Methoden und statische Eignschaften.

Hinweis:

Seit PHP 8.1.0 sind der Aufruf einer statischen Methode oder der Zugriff auf eine statische Eigenschaft direkt in einem Trait veraltet. Auf statische Methoden und Eigenschaften sollte nur in einer Klasse zugegriffen werden, die den Trait verwendet.

Beispiel #9 Statische Variablen

<?php
trait Counter {
    public function 
inc() {
        static 
$c 0;
        
$c $c 1;
        echo 
"$c\n";
    }
}

class 
C1 {
    use 
Counter;
}

class 
C2 {
    use 
Counter;
}

$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>

Beispiel #10 Statische Methoden

<?php
trait StaticExample {
    public static function 
doSomething() {
        return 
'Tue etwas';
    }
}

class 
Example {
    use 
StaticExample;
}

Example::doSomething();
?>

Beispiel #11 Statische Eigenschaften

<?php
trait StaticExample {
    public static 
$static 'foo';
}

class 
Example {
    use 
StaticExample;
}

echo 
Example::$static;
?>

Eigenschaften

Traits können ebenfalls Eigenschaften definieren.

Beispiel #12 Eigenschaften definieren

<?php
trait PropertiesTrait {
    public 
$x 1;
}

class 
PropertiesExample {
    use 
PropertiesTrait;
}

$example = new PropertiesExample;
$example->x;
?>

Definiert ein Trait eine Eigenschaft, dann kann eine Klasse keine Eigenschaft mit dem selben Namen definieren, es sei denn, sie ist kompatibel (selbe Sichtbarkeit und Initialwert); andernfalls wird ein fataler Fehler auftreten.

Beispiel #13 Konfliktauflösung

<?php
trait PropertiesTrait {
    public 
$same true;
    public 
$different false;
}

class 
PropertiesExample {
    use 
PropertiesTrait;
    public 
$same true;
    public 
$different true// Fatal error
}
?>

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Grundlagen von Views in MySQL

Views in einer MySQL-Datenbank bieten die Möglichkeit, eine virtuelle Tabelle basierend auf dem Ergebnis einer SQL-Abfrage zu erstellen. ...

admin

Autor : admin
Kategorie: mySQL-Tutorials

Definition von Stored Procedures - eine Einführung

Stored Procedures sind vordefinierte SQL-Codeblöcke, die in einer Datenbank gespeichert sind und bei Bedarf aufgerufen werden können. ...

Bernie

Autor : ebiz-consult GmbH & Co. KG
Kategorie: mySQL-Tutorials

Wie kann man komplexe Abfragen mit SQL-Querys In MySQLi effektiv durchführen?

In diesem MySQL-Tutorial wird erklärt, wie komplexe SQL-Abfragen in MySQLi effizient durchgeführt werden können. Wir werden uns mit verschiedenen Aspekten der Datenbankabfrage beschäftigen und spezifische Methoden kennenlernen. ...

TheMax

Autor : TheMax
Kategorie: mySQL-Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Professioneller Webentwickler & Webdesigner

Of course, here is the translation: Hello, Thank you for your interest in the long-term project. Your extensive skills and experience in web dev ...

Geschrieben von Athelstan am 15.04.2024 09:25:39
Forum: Jobgesuche
Wir stellen unsere SEO-Agentur vor

Hallo In der heutigen digitalen Welt war es für Unternehmen noch nie so einfach, ihre Reichweite weltweit zu vergrößern. Wenn Sie außerhalb I ...

Geschrieben von thomasmuller am 14.04.2024 07:18:33
Forum: User stellen sich vor
Spielplan für 4 Gruppen zu je 6 Teams auf 2 Feldern

Hallöchen zusammen, ich versuche derzeit unseren Excel-Spielplan in PHP zu überführen. Eigentlich bin ich auch shon fertig - wenn da nicht dies ...

Geschrieben von derH0st am 11.04.2024 15:58:37
Forum: PHP Developer Forum
PHP 8.3.3 - App kann auf dem PC nicht ausgeführt werden

Problem gelöst. Die php.exe hatte einen defekt. Neue heruntergeladen und fertig.

Geschrieben von Tetra1081 am 10.04.2024 16:49:14
Forum: PHP Developer Forum