⊗ppOpTrMC 79 of 107 menu

PHP да ООП да трейтлар усуллари конфликтини хал этиш

Бир класс бир нечта трейтлардан фойдаланиши мумкин бўлгани учун, икки трейт бир хил номли усулларга эга бўлганда муаммо юзага келиши мумкин.

Бундай ҳолда PHP фатал хатоликни чиқаради. Вазиятни түзәтиш учун номлар конфликтини очиқ ҳал этиш керак бўлади. Бу қандай амалга оширилишини амалиётда кўрамиз.

Бизда бир хил method усулига эга бўлган икки трейт бўлсин:

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

Шунингдек, бизда ҳар икки трейтимиздан фойдаланувчи Test класси ҳам бўлсин. Агар биз трейтларни классимизга содда уласак, PHP трейтларда мос келувчи усуллар мавжудлиги сабабли хатолик чиқаради:

<?php // Бу код хатолик чиқаради! class Test { use Trait1, Trait2; // трейтларни улаймиз } ?>

Келгинг, трейтларимиз номлари конфликтини ҳал қилайлик. Бунинг учун махсус insteadof оператори мавжуд. Ушбу оператор ёрдамида биз Trait2 трейтининг шундай усули ўрнига Trait1 трейтининг method усулидан фойдаланамиз:

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

Кўриб турганингиздек, синтаксис шундай: аввал трейт номи, сўнг икки қос нўқта, сўнг усул номи, сўнг бизнинг insteadof операторимиз ва иккинчи трейт номи.

Келгинг, текширамиз:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } public function __construct() { echo $this->method(); // 1 ни чиқаради, чунки бу биринчи трейтнинг усули } } new Test; ?>

Шундай қилиб, биз классимизда агар method усули ишлатилса, уни биринчи трейтдан олиш керак дедик. Тескариси ҳам мумкин - иккинчи трейтнинг усулини олиш:

<?php class Test { use Trait1, Trait2 { Trait2::method insteadof Trait1; } public function __construct() { echo $this->method(); // 2 ни чиқаради, чунки бу иккинчи трейтнинг усули } } new Test; ?>

Ҳар ҳолда, биз бир трейтнинг усулидан фойдаланишни кўрсатсак, иккинчи трейтнинг усули истифодага яроксиз бўлади. Иккинчи трейтнинг усулидан as калит сўзи орқали унинг номини ўзгартириб фойдаланиш мумкин, мана шундай:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; Trait2::method as method2; } public function __construct() { echo $this->method() + $this->method2(); // 3 ни чиқаради } } new Test; ?>

Истасангиз биринчи трейтнинг усули номини ҳам ўзгартиришингиз мумкин:

<?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 ни чиқаради } } new Test; ?>

as калит сўзини insteadof орқали асосий усулни аникламай истифода этиш мумкин эмас, бу хатолик чиқаради:

<?php // Бу класс хатолик чиқаради: 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 ва Trait3 номли 3 та трейт яратинг. Биринчи трейтда 1 ни қайтарувчи method усули бўлсин, иккинчи трейтда - 2 ни қайтарувчи бир хил номли усул, учинчи трейтда эса - 3 ни қайтарувчи бир хил номли усул бўлсин.

Биз яратган ҳар уч трейтдан фойдаланувчи Test классини яратинг. Ушбу классда уланган трейтлар усуллари натижалари йиғиндисини қайтарувчи getSum усулини яратинг.

Ўзбек
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeOʻzbekTiếng Việt
Биз веб-сайт ишлаши, таҳлил қилиш ва персоналлаштириш учун кукидан фойдаланамиз. Маълумотларни қайта ишлаш Махфийлик сиёсатига мувофиқ амалга оширилади.
ҳаммасини қабул қилиш мослаштириш рад этиш