Treitu metožu konfliktu atrisināšana OOP PHP
Tā kā viena klase var izmantot vairākus treitus, var rasties problēma, kad diviem treitiem ir tādas pašas metodes.
Šajā gadījumā PHP izvadīs fatālu kļūdu. Lai novērstu situāciju, būs jāatrisina konflikts ar vārdu skaidri. Kā tas tiek darīts - apskatīsim praksē.
Pieņemsim, ka mums ir divi treiti ar vienādu
metodi method:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Pieņemsim, ka mums ir arī klase Test,
kas izmanto abus mūsu treitus. Ja vienkārši
pievienos abus treitus savai klasei, tad
PHP izvadīs kļūdu, jo treitiem ir
sakrītošas metodes:
<?php
// Šis kods izvadīs kļūdu!
class Test
{
use Trait1, Trait2; // pievienojam treitus
}
?>
Atrisināsim vārdu konfliktu
mūsu treitos. Šim nolūkam pastāv īpašs
operators insteadof. Ar šī operatora palīdzību
izmantosim metodi method no treita
Trait1 tādas pašas metodes vietā no treita
Trait2:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Kā jūs redzat, sintakse šeit ir šāda: vispirms
treita nosaukums, tad divi koli, tad metodes
nosaukums, tad mūsu operators insteadof
un otrā treita nosaukums.
Pārbaudīsim:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // izvadīs 1, jo šī ir pirmā treita metode
}
}
new Test;
?>
Tātad, savā klasē mēs norādījām, ka, ja
tiek izmantota metode method, tad jāņem
tā no pirmā treita. Var arī otrādi
- paņemt otrā treita metodi:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // izvadīs 2, jo šī ir otrā treita metode
}
}
new Test;
?>
Jebkurā gadījumā, ja mēs norādām izmantot
viena treita metodi, tad otrā treita metode
kļūst nepieejama. Var izmantot
arī otrā treita metodi, pārdēvējot to
ar atslēgvārdu as, šādi:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // izvadīs 3
}
}
new Test;
?>
Vēloties var pārdēvēt arī pirmā treita metodi:
<?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(); // izvadīs 3
}
}
new Test;
?>
Izmantot atslēgvārdu as bez
gabala metodes definēšanas ar insteadof
nav iespējams, tas izvadīs kļūdu:
<?php
// Šī klase izvadīs kļūdu:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Izveidojiet 3 treitus ar nosaukumiem Trait1,
Trait2 un Trait3. Lai pirmajā
treitā būtu metode method, kas atgriež
1, otrajā treitā - tādas pašas nosaukuma
metode, kas atgriež 2, bet trešajā
treitā - tādas pašas nosaukuma metode,
kas atgriež 3.
Izveidojiet klasi Test, kas izmanto
visus trīs mūsu izveidotos treitus. Izveidojiet
šajā klasē metodi getSum, kas atgriež
pievienoto treitu metožu rezultātu summu.