⊗ppOpTrMC 79 of 107 menu

Zgjidhja e konflikteve të metodave të treteve në OOP në PHP

Meqenëse një klasë mund të përdorë disa trete, mund të hasim një problem që lind kur dy trete kanë metoda me emra të njëjtë.

Në këtë rast PHP do të nxjerrë një gabim fatal. Për të rregulluar situatën, do të duhet të zgjidhim konfliktin e emrave në mënyrë të qartë. Si bëhet kjo - do ta shohim në praktikë.

Le të supozojmë se kemi dy trete me të njëjtin metod method:

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

Le të supozojmë gjithashtu se kemi një klasë Test, që përdor të dy tretet tona. Nëse thjesht lidhim të dy tretet në klasën tonë, PHP do të nxjerrë një gabim, pasi tretet kanë metoda që përputhen:

<?php // Ky kod do të nxjerrë gabim! class Test { use Trait1, Trait2; // lidhim tretet } ?>

Le të zgjidhim konfliktin e emrave të tretave tanë. Për këtë ekziston një operator i veçantë insteadof. Me ndihmën e këtij operatori do të përdorim metodën method të tretit Trait1 në vend të metodës së njëjtë të tretit Trait2:

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

Siç e shihni, sintaksa këtu është si më poshtë: fillimisht emri i tretit, pastaj dy pika, pastaj emri i metodës, pastaj operatori ynë insteadof dhe emri i tretit të dytë.

Le të kontrollojmë:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } public function __construct() { echo $this->method(); // do të nxjerrë 1, sepse ky është metoda e tretit të parë } } new Test; ?>

Pra, në klasën tonë thamë se nëse përdoret metoda method, atëherë duhet të merret nga treiti i parë. Mund të bëhet edhe anasjelltas - të merret metoda e tretit të dytë:

<?php class Test { use Trait1, Trait2 { Trait2::method insteadof Trait1; } public function __construct() { echo $this->method(); // do të nxjerrë 2, sepse ky është metoda e tretit të dytë } } new Test; ?>

Sido që të jetë, nëse përcaktojmë të përdorim metodën e një treiti, atëherë metoda e tretit të dytë bëhet e paarritshme. Mund të përdoret edhe metoda e tretit të dytë, duke e riemërtuar atë përmes fjalës kyçe as, kështu:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; Trait2::method as method2; } public function __construct() { echo $this->method() + $this->method2(); // do të nxjerrë 3 } } new Test; ?>

Nëse dëshironi, mund të riemërtoni edhe metodën e tretit të parë:

<?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(); // do të nxjerrë 3 } } new Test; ?>

Nuk lejohet përdorimi i fjalës kyçe as pa përcaktimin e metodës kryesore përmes insteadof, kjo do të nxjerrë gabim:

<?php // Kjo klasë do të nxjerrë gabim: class Test { use Trait1, Trait2 { Trait1::method as method1; Trait2::method as method2; } public function __construct() { echo $this->method1() + $this->method2(); } } new Test; ?>

Krijoni 3 trete me emrat Trait1, Trait2 dhe Trait3. Le të ketë në treitin e parë metoda method, që kthen 1, në treitin e dytë - metodë me të njëjtin emër, që kthen 2, dhe në treitin e tretë - metodë me të njëjtin emër, që kthen 3.

Krijoni një klasë Test, që përdor të tre tretet e krijuara nga ne. Krijoni në këtë klasë metodën getSum, që kthen shumën e rezultateve të metodave të treteve të lidhur.

Shqip
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ne përdorim cookie për funksionimin e sajtit, analizën dhe personalizimin. Përpunimi i të dhënave bëhet në përputhje me Politikën e Privatësisë.
prano të gjitha konfiguro refuzo