Zgjidhja e konflikteve të metodave të treteve në OOP në PHP
Meqenëse një klasë mund të përdorë disa trete, mund të hasim një problem që lind kur dy trete kanë metoda me emra të njëjtë.
Në këtë rast PHP do të nxjerrë një gabim fatal. Për të rregulluar situatën, do të duhet të zgjidhim konfliktin e emrave në mënyrë të qartë. Si bëhet kjo - do ta shohim në praktikë.
Le të supozojmë se kemi dy trete me të njëjtin
metod method:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Le të supozojmë gjithashtu se kemi një klasë Test,
që përdor të dy tretet tona. Nëse thjesht
lidhim të dy tretet në klasën tonë,
PHP do të nxjerrë një gabim, pasi tretet kanë
metoda që përputhen:
<?php
// Ky kod do të nxjerrë gabim!
class Test
{
use Trait1, Trait2; // lidhim tretet
}
?>
Le të zgjidhim konfliktin e emrave
të tretave tanë. Për këtë ekziston një operator
i veçantë insteadof. Me ndihmën e këtij operatori
do të përdorim metodën method të tretit
Trait1 në vend të metodës së njëjtë të tretit
Trait2:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Siç e shihni, sintaksa këtu është si më poshtë: fillimisht
emri i tretit, pastaj dy pika, pastaj emri
i metodës, pastaj operatori ynë insteadof
dhe emri i tretit të dytë.
Le të kontrollojmë:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // do të nxjerrë 1, sepse ky është metoda e tretit të parë
}
}
new Test;
?>
Pra, në klasën tonë thamë se nëse
përdoret metoda method, atëherë duhet
të merret nga treiti i parë. Mund të bëhet edhe anasjelltas
- të merret metoda e tretit të dytë:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // do të nxjerrë 2, sepse ky është metoda e tretit të dytë
}
}
new Test;
?>
Sido që të jetë, nëse përcaktojmë të përdorim
metodën e një treiti, atëherë metoda e tretit të dytë
bëhet e paarritshme. Mund të përdoret
edhe metoda e tretit të dytë, duke e riemërtuar atë
përmes fjalës kyçe as, kështu:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // do të nxjerrë 3
}
}
new Test;
?>
Nëse dëshironi, mund të riemërtoni edhe metodën e tretit të parë:
<?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(); // do të nxjerrë 3
}
}
new Test;
?>
Nuk lejohet përdorimi i fjalës kyçe as pa
përcaktimin e metodës kryesore përmes insteadof,
kjo do të nxjerrë gabim:
<?php
// Kjo klasë do të nxjerrë gabim:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Krijoni 3 trete me emrat Trait1,
Trait2 dhe Trait3. Le të ketë në treitin e parë
metoda method, që kthen
1, në treitin e dytë - metodë me të njëjtin emër,
që kthen 2, dhe në treitin e tretë
- metodë me të njëjtin emër,
që kthen 3.
Krijoni një klasë Test, që përdor
të tre tretet e krijuara nga ne. Krijoni në
këtë klasë metodën getSum, që kthen
shumën e rezultateve të metodave të treteve të lidhur.