Die oplos van treitmetode-konflikte in OOP in PHP
Aangesien een klas verskeie treite kan gebruik, kan ons 'n probleem teëkom wat ontstaan wanneer twee treite methode met dieselfde naam het.
In hierdie geval sal PHP 'n fatale fout gee. Om die situasie reg te stel, sal die konflik van name eksplisiet opgelos moet word. Hoe om dit te doen - kom ons kyk prakties.
Gestel ons het twee treite met dieselfde
metode method:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Gestel ons het ook 'n klas Test
wat albei van ons treite gebruik. As ons net
albei treite by ons klas aansluit, sal
PHP 'n fout gee, aangesien die treite
ooreenstemmende metodes het:
<?php
// Hierdie kode sal 'n fout gee!
class Test
{
use Trait1, Trait2; // sluit treite aan
}
?>
Kom ons los die konflik van name van
ons treite op. Daar is 'n spesiale operator
insteadof vir hierdie doel. Met hierdie operator
sal ons die metode method van treit
Trait1 gebruik in plaas van die soortgelyke metode van treit
Trait2:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Soos jy kan sien, is die sintaksis soos volg: eers die
naam van die treit, dan twee dubbelpunte, dan die naam van die
metode, dan ons operator insteadof
en die naam van die tweede treit.
Kom ons toets:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // sal 1 uitvoer, want dit is die metode van die eerste treit
}
}
new Test;
?>
Dus, in ons klas het ons gesê dat as
metode method gebruik word, moet
dit van die eerste treit geneem word. Ons kan ook omgekeerd doen
- die metode van die tweede treit neem:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // sal 2 uitvoer, want dit is die metode van die tweede treit
}
}
new Test;
?>
In elk geval, as ons spesifiseer om die
metode van een treit te gebruik, dan is die metode van die tweede treit
nie meer beskikbaar nie. Ons kan ook die
metode van die tweede treit gebruik deur dit
hernoem met die sleutelwoord as, soos volg:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // sal 3 uitvoer
}
}
new Test;
?>
As jy wil, kan jy ook die metode van die eerste treit hernoem:
<?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(); // sal 3 uitvoer
}
}
new Test;
?>
Die sleutelwoord as sonder
die definisie van 'n hoofmetode deur insteadof
te gebruik is nie moontlik nie, dit sal 'n fout gee:
<?php
// Hierdie klas sal 'n fout gee:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Maak 3 treite met die name Trait1,
Trait2 en Trait3. Laat die eerste
treit 'n metode method hê wat
1 teruggee, die tweede treit - 'n metode met dieselfde naam
wat 2 teruggee, en die derde
treit - 'n metode met dieselfde naam
wat 3 teruggee.
Maak 'n klas Test wat
al drie treite wat ons gemaak het, gebruik. Maak in
hierdie klas 'n metode getSum wat
die som van die resultate van die aangeslote treite se metodes teruggee.