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.