⊗ppOpTrMC 79 of 107 menu

Auflösung von Methodenkonflikten in Traits in OOP in PHP

Da eine Klasse mehrere Traits verwenden kann, kann ein Problem auftreten, wenn zwei Traits Methoden mit demselben Namen haben.

In diesem Fall gibt PHP einen fatalen Fehler aus. Um die Situation zu beheben, muss der Namenskonflikt explizit aufgelöst werden. Wie das gemacht wird, schauen wir uns in der Praxis an.

Angenommen, wir haben zwei Traits mit derselben Methode method:

<?php trait Trait1 { private function method() { return 1; } } trait Trait2 { private function method() { return 2; } } ?>

Angenommen, wir haben auch eine Klasse Test, die beide unserer Traits verwendet. Wenn wir einfach beide Traits in unserer Klasse einbinden, gibt PHP einen Fehler aus, da die Traits übereinstimmende Methoden haben:

<?php // Dieser Code erzeugt einen Fehler! class Test { use Trait1, Trait2; // Traits einbinden } ?>

Lassen Sie uns den Namenskonflikt unserer Traits auflösen. Dafür gibt es einen speziellen Operator insteadof. Mit diesem Operator verwenden wir die Methode method des Traits Trait1 anstelle derselben Methode des Traits Trait2:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } } new Test; ?>

Wie Sie sehen, ist die Syntax wie folgt: zuerst der Traitname, dann zwei Doppelpunkte, dann der Methodenname, dann unser Operator insteadof und der Name des zweiten Traits.

Lassen Sie uns das überprüfen:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } public function __construct() { echo $this->method(); // gibt 1 aus, da es die Methode des ersten Traits ist } } new Test; ?>

Zusammenfassend haben wir in unserer Klasse festgelegt, dass, wenn die Methode method verwendet wird, sie vom ersten Trait genommen werden soll. Es geht auch umgekehrt - die Methode des zweiten Traits nehmen:

<?php class Test { use Trait1, Trait2 { Trait2::method insteadof Trait1; } public function __construct() { echo $this->method(); // gibt 2 aus, da es die Methode des zweiten Traits ist } } new Test; ?>

Auf jeden Fall, wenn wir angeben, die Methode eines Traits zu verwenden, ist die Methode des zweiten Traits nicht verfügbar. Man kann auch die Methode des zweiten Traits verwenden, indem man sie über das Schlüsselwort as umbenennt, wie hier:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; Trait2::method as method2; } public function __construct() { echo $this->method() + $this->method2(); // gibt 3 aus } } new Test; ?>

Bei Bedarf kann auch die Methode des ersten Traits umbenannt werden:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; Trait1::method as method1; Trait2::method as method2; } public function __construct() { echo $this->method1() + $this->method2(); // gibt 3 aus } } new Test; ?>

Das Schlüsselwort as ohne Festlegung der Hauptmethode über insteadof zu verwenden, ist nicht erlaubt und erzeugt einen Fehler:

<?php // Diese Klasse erzeugt einen Fehler: class Test { use Trait1, Trait2 { Trait1::method as method1; Trait2::method as method2; } public function __construct() { echo $this->method1() + $this->method2(); } } new Test; ?>

Erstellen Sie 3 Traits mit den Namen Trait1, Trait2 und Trait3. Der erste Trait soll eine Methode method haben, die 1 zurückgibt, der zweite Trait - eine gleichnamige Methode, die 2 zurückgibt, und der dritte Trait - eine gleichnamige Methode, die 3 zurückgibt.

Erstellen Sie eine Klasse Test, die alle drei von uns erstellten Traits verwendet. Erstellen Sie in dieser Klasse eine Methode getSum, die die Summe der Ergebnisse der Methoden der eingebundenen Traits zurückgibt.

Deutsch
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wir verwenden Cookies für den Betrieb der Website, Analyse und Personalisierung. Die Datenverarbeitung erfolgt gemäß der Datenschutzerklärung.
alle akzeptieren anpassen ablehnen