Reševanje konfliktov metod lastnosti v OOP v PHP
Ker lahko en razred uporablja več lastnosti, se lahko pojavi težava, ko imata dve lastnosti metode z enakim imenom.
V tem primeru bo PHP izpisal usodno napako. Da popravimo situacijo, bomo morali konflikt imen eksplicitno razrešiti. Kako se to naredi - poglejmo v praksi.
Recimo, da imamo dve lastnosti z enako
metodo method:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Recimo, da imamo tudi razred Test,
ki uporablja obe naš lastnosti. Če preprosto
povežemo obe lastnosti z našim razredom, bo
PHP izpisal napako, ker imata lastnosti
metode, ki se ujemajo:
<?php
// Ta koda bo sprožila napako!
class Test
{
use Trait1, Trait2; // povežemo lastnosti
}
?>
Razrešimo konflikt imen
naših lastnosti. Za to obstaja poseben
operator insteadof. S tem operatorjem
bomo uporabili metodo method lastnosti
Trait1 namesto podobne metode lastnosti
Trait2:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Kot vidite, je sintaksa naslednja: najprej
ime lastnosti, nato dva dvopičja, nato ime
metode, nato naš operator insteadof
in ime druge lastnosti.
Preverimo:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // izpiše 1, ker je to metoda prve lastnosti
}
}
new Test;
?>
Torej, v našem razredu smo rekli, da če
se uporablja metoda method, je treba
jo vzeti iz prve lastnosti. Lahko je tudi obratno
- vzemite metodo druge lastnosti:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // izpiše 2, ker je to metoda druge lastnosti
}
}
new Test;
?>
V vsakem primeru, če navedemo, da uporabljamo
metodo ene lastnosti, potem metoda druge lastnosti
postane nedostopna. Lahko uporabimo
tudi metodo druge lastnosti, tako da jo preimenujemo
z ključno besedo as, takole:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // izpiše 3
}
}
new Test;
?>
Po želji lahko preimenujete tudi metodo prve lastnosti:
<?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(); // izpiše 3
}
}
new Test;
?>
Uporaba ključne besede as brez
določanja glavne metode z insteadof
ni dovoljena, to bo povzročilo napako:
<?php
// Ta razred bo sprožil napako:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Naredite 3 lastnosti z imeni Trait1,
Trait2 in Trait3. Naj bo v prvi
lastnosti metoda method, ki vrne
1, v drugi lastnosti - metoda z enakim imenom,
ki vrne 2, v tretji
lastnosti pa - metoda z enakim imenom,
ki vrne 3.
Naredite razred Test, ki uporablja
vse tri ustvarjene lastnosti. Naredite v
tem razredu metodo getSum, ki vrne
vsoto rezultatov metod priključenih lastnosti.