⊗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çeЎзбекOʻzbekTiếng Việt
Биз сайттин иштөөсү, аналитика жана персонализация үчүн cookie файлдарын колдонобуз. Маалыматтарды иштетүү Маалыматты коргоо саясаты боюнча жүргүзүлөт.
баарын кабыл алуу ыңгайлаштыруу четке кагуу