Kutatua Migogoro ya Mbinu za Traits katika OOP PHP
Kwa kuwa darasa moja linaweza kutumia traits nyingi, tunaweza kukabiliwa na tatizo linapotokea wakati traits mbili zina mbinu zenye majina sawa.
Katika hali hii, PHP itatoa hitilafu kubwa (fatal error). Ikusudie kurekebisha hali hiyo, itabidi utatue mgogoro wa majina kwa njia wazi. Jinsi hii inavyofanyika tutaona kwa vitendo.
Wacha tuwe na traits mbili zilizo na mbinu
sawa method:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Wacha tuwe pia na darasa Test,
linalotumia traits zetu zote mbili. Ikiwa tu
utaunganisha traits zote mbili kwenye darasa letu, basi
PHP itatoa hitilafu, kwa sababu traits zina
mbinu zinazolingana:
<?php
// Msimbo huu utatoa hitilafu!
class Test
{
use Trait1, Trait2; // tunaunganisha traits
}
?>
Wacha tutatue mgogoro wa majina
ya traits zetu. Kwa ajili hii kuna kiendeshzi maalum
insteadof. Kwa kutumia kiendeshzi hiki
tutatumia mbinu method ya trait
Trait1 badala ya mbinu sawa ya trait
Trait2:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Kama unavyoona, sintaksia hapa ni ifuatayo: kwanza
jina la trait, kisha koloni mbili, kisha jina
la mbinu, kisha kiendeshzi chetu insteadof
na jina la trait ya pili.
Wacha tuangalie:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // itatoa 1, kwani hii ni mbinu ya trait ya kwanza
}
}
new Test;
?>
Kwa hivyo, katika darasa letu tulisema kuwa ikiwa
mtumiaji anatumia mbinu method, basi inapaswa
kuchukuliwa kutoka kwa trait ya kwanza. Vinginevyo pia inawezekana
- kuchukua mbinu ya trait ya pili:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // itatoa 2, kwani hii ni mbinu ya trait ya pili
}
}
new Test;
?>
Hata hivyo, ikiwa tunabainisha kutumia
mbinu ya trait moja, basi mbinu ya trait ya pili
inakuwa haipatikani. Inawezekana kutumia
na mbinu ya trait ya pili, ukibadilisha jina lake
kupitia neno kuu as, kama hivi:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // itatoa 3
}
}
new Test;
?>
Kwa hiari yako unaweza kubadilisha jina la mbinu ya kwanza ya trait:
<?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(); // itatoa 3
}
}
new Test;
?>
Kutumia neno kuu as bila
kufafanua mbinu kuu kupitia insteadof
hakuwezekani, hii itatoa hitilafu:
<?php
// Darasa hili litatoa hitilafu:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Tengeneza traits 3 zenye majina Trait1,
Trait2 na Trait3. Acha katika trait ya kwanza
iwe na mbinu method, inayorudisha
1, katika trait ya pili - mbinu yenye jina sawa,
inayorudisha 2, na katika trait ya tatu
- mbinu yenye jina sawa,
inayorudisha 3.
Tengeneza darasa Test, lenye kutumia
traits zote tatu tulizozitengeneza. Tengeneza ndani ya
darasa hili mbinu getSum, inayorudisha
jumla ya matokeo ya mbinu za traits zilizounganishwa.