PHP-niň OOP-dä treýt metodlarynyň konfliktlerini çözmek
Bir klas birnäçe treýt ulanyp bilşi sebäpli, iki treýtiň birmeňzeş atly metodlary bolanda, problem ýüze çykyp biler.
Bu ýagdaýda PHP fatal ýalňyşlygy (fatal error) çykarar. Ýagdaýy düzetmek üçin, atlar konflikti aýdan çözülmelidir. Bunuň nädip edilýändigini amalyýetda göreliň.
Bizde birmeňzeş method atly metoda eýe bolan iki treýt bar diýeliň:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Şeýle hem, iki treýtimizi hem ulanyan Test atly klasymyz bar diýeliň. Treýtleriň birmeňzeş metodlary bar bolany üçin, her iki treýti klasa ýönekeýçe birikdirsek, PHP ýalňyşlyk çykarar:
<?php
// Bu kod ýalňyşlyk çykarar!
class Test
{
use Trait1, Trait2; // treýtleri birikdirýäris
}
?>
Geliň, treýtlerimiziň at konfliktini çözeliň. Bunuň üçin aýratyn insteadof operatory bar. Bu operator bilen, Trait2 treýtiniň şol bir atly metodynyň ýerine, Trait1 treýtiniň method metodyny ulanarys:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Görşüňiz ýaly, bu ýerde sintaksis şeýle: ilki treýtiň ady, soňra iki gözenek, soňra metod ady, soňra insteadof operatorymyz we ikinji treýtiň ady.
Geliň barlalyň:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // 1 çykarar, sebäbi bu birinji treýtiň metodudyr
}
}
new Test;
?>
Şeýlelik bilen, klasymyzda aýtdyk, eger method metody ulanylsa, ony birinji treýtdän almaly. Kersi hem bolup biler - ikinji treýtiň metodyny almak:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // 2 çykarar, sebäbi bu ikinji treýtiň metodudyr
}
}
new Test;
?>
Her haýsyda bolsa, bir treýtiň metodyny ulanmalydygyny görkezsek, ikinji treýtiň metody elýeterli bolmaýar. as açar sözi arkaly ony atlandyryp, ikinji treýtiň metodyny hem ulanyp bolýar, mysal üçin:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // 3 çykarar
}
}
new Test;
?>
Isleseňiz, birinji treýtiň metodyny hem atlandyryp bilersiňiz:
<?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(); // 3 çykarar
}
}
new Test;
?>
Esasy metodu insteadof arkaly kesgitlemän, diňe as açar sözini ulanmak bolmaýar, bu ýalňyşlyk çykarar:
<?php
// Bu klas ýalňyşlyk çykarar:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Trait1, Trait2 we Trait3 atly 3 treýt düzüň. Birinji treýtiň method atly metodi 1 gaýtarsyn, ikinji treýtiň birmeňzeş atly metodi 2 gaýtarsyn, üçünji treýtiň bolsa birmeňzeş atly metodi 3 gaýtarsyn.
Düzelen üç treýti hem ulanyan Test atly klas düzüň. Bu klasda, birikdirilen treýtlerdäki metodlaryň netijeleriniň jemini gaýtaran getSum atly metod ýazyň.