⊗ppOpTrMC 79 of 107 menu

PHP-də OOP-də treyt metodlarının konfliktlərinin həlli

Bir sinif bir neçə treytdən istifadə edə bildiyi üçün, iki treytin eyniadlı metodlara malik olduğu zaman yarana bilən problemlə qarşılaşa bilərik.

Bu halda PHP fatal xəta verəcək. Vəziyyəti düzəltmək üçün ad konfliktini aşkar şəkildə həll etmək lazımdır. Bunun necə edildiyini praktikada nəzərdən keçirək.

Tutaq ki, bizdə eyni method adlı metodu olan iki treyt var:

<?php trait Trait1 { private function method() { return 1; } } trait Trait2 { private function method() { return 2; } } ?>

Tutaq ki, bizdə həm də hər iki treytimizi istifadə edən Test sinfi var. Əgər treytləri sinfimizə sadəcə birləşdirsək, onda PHP xəta verəcək, çünki treytlərin üst-üstə düşən metodları var:

<?php // Bu kod xəta verəcək! class Test { use Trait1, Trait2; // treytləri birləşdiririk } ?>

Gəlin treytlərimizin ad konfliktini həll edək. Bunun üçün xüsusi insteadof operatoru var. Bu operatorun köməyi ilə Trait2 treytinin eyni metodu əvəzinə Trait1 treytinin method metodundan istifadə edək:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } } new Test; ?>

Gördüyünüz kimi, sintaksis belədir: əvvəlcə treytin adı, sonra iki nöqtə, sonra metodun adı, sonra bizim insteadof operatoru və ikinci treytin adı.

Gəlin yoxlayaq:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } public function __construct() { echo $this->method(); // 1 çap edəcək, çünki bu birinci treytin metodudur } } new Test; ?>

Beləliklə, biz sinfimizdə dedik ki, əgər method metodu istifadə olunursa, onda on birinci treytdən götürmək lazımdır. Əksinə də edə bilərik - ikinci treytin metodunu götürək:

<?php class Test { use Trait1, Trait2 { Trait2::method insteadof Trait1; } public function __construct() { echo $this->method(); // 2 çap edəcək, çünki bu ikinci treytin metodudur } } new Test; ?>

Hər halda, əgər biz bir treytin metodundan istifadə etməyi göstəririksə, onda ikinci treytin metoduna giriş mümkün olmur. as açar sözü vasitəsilə onu adını dəyişdirərək ikinci treytin metodundan da istifadə etmək olar, bu cür:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; Trait2::method as method2; } public function __construct() { echo $this->method() + $this->method2(); // 3 çap edəcək } } new Test; ?>

İstəsəniz, birinci treytin metodunun da adını dəyişə bilərsiniz:

<?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 çap edəcək } } new Test; ?>

insteadof vasitəsilə əsas metodu təyin etmədən as açar sözündən istifadə etmək olmaz, bu xəta verəcək:

<?php // Bu sinif xəta verəcək: class Test { use Trait1, Trait2 { Trait1::method as method1; Trait2::method as method2; } public function __construct() { echo $this->method1() + $this->method2(); } } new Test; ?>

Trait1, Trait2Trait3 adlı 3 treyt hazırlayın. Birinci treytdə 1 qaytaran method metodu olsun, ikinci treytdə - 2 qaytaran eyniadlı metod, üçüncü treytdə isə - 3 qaytaran eyniadlı metod olsun.

Bizim yaratdığımız hər üç treyti istifadə edən Test sinfini hazırlayın. Bu sinifdə birləşdirilmiş treytlərin metodlarının nəticələrinin cəmini qaytaran getSum metodu yaradın.

azbydeenesfrkakkptruuz