⊗ppOpTrMC 79 of 107 menu

Treitu metožu konfliktu atrisināšana OOP PHP

Tā kā viena klase var izmantot vairākus treitus, var rasties problēma, kad diviem treitiem ir tādas pašas metodes.

Šajā gadījumā PHP izvadīs fatālu kļūdu. Lai novērstu situāciju, būs jāatrisina konflikts ar vārdu skaidri. Kā tas tiek darīts - apskatīsim praksē.

Pieņemsim, ka mums ir divi treiti ar vienādu metodi method:

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

Pieņemsim, ka mums ir arī klase Test, kas izmanto abus mūsu treitus. Ja vienkārši pievienos abus treitus savai klasei, tad PHP izvadīs kļūdu, jo treitiem ir sakrītošas metodes:

<?php // Šis kods izvadīs kļūdu! class Test { use Trait1, Trait2; // pievienojam treitus } ?>

Atrisināsim vārdu konfliktu mūsu treitos. Šim nolūkam pastāv īpašs operators insteadof. Ar šī operatora palīdzību izmantosim metodi method no treita Trait1 tādas pašas metodes vietā no treita Trait2:

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

Kā jūs redzat, sintakse šeit ir šāda: vispirms treita nosaukums, tad divi koli, tad metodes nosaukums, tad mūsu operators insteadof un otrā treita nosaukums.

Pārbaudīsim:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } public function __construct() { echo $this->method(); // izvadīs 1, jo šī ir pirmā treita metode } } new Test; ?>

Tātad, savā klasē mēs norādījām, ka, ja tiek izmantota metode method, tad jāņem tā no pirmā treita. Var arī otrādi - paņemt otrā treita metodi:

<?php class Test { use Trait1, Trait2 { Trait2::method insteadof Trait1; } public function __construct() { echo $this->method(); // izvadīs 2, jo šī ir otrā treita metode } } new Test; ?>

Jebkurā gadījumā, ja mēs norādām izmantot viena treita metodi, tad otrā treita metode kļūst nepieejama. Var izmantot arī otrā treita metodi, pārdēvējot to ar atslēgvārdu as, šādi:

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

Vēloties var pārdēvēt arī pirmā treita metodi:

<?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(); // izvadīs 3 } } new Test; ?>

Izmantot atslēgvārdu as bez gabala metodes definēšanas ar insteadof nav iespējams, tas izvadīs kļūdu:

<?php // Šī klase izvadīs kļūdu: class Test { use Trait1, Trait2 { Trait1::method as method1; Trait2::method as method2; } public function __construct() { echo $this->method1() + $this->method2(); } } new Test; ?>

Izveidojiet 3 treitus ar nosaukumiem Trait1, Trait2 un Trait3. Lai pirmajā treitā būtu metode method, kas atgriež 1, otrajā treitā - tādas pašas nosaukuma metode, kas atgriež 2, bet trešajā treitā - tādas pašas nosaukuma metode, kas atgriež 3.

Izveidojiet klasi Test, kas izmanto visus trīs mūsu izveidotos treitus. Izveidojiet šajā klasē metodi getSum, kas atgriež pievienoto treitu metožu rezultātu summu.

Latviešu
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Mēs izmantojam sīkdatnes, lai nodrošinātu vietnes darbību, analīti un personalizāciju. Datu apstrāde notiek saskaņā ar Konfidencialitātes politiku.
pieņemt visus iestatīt noraidīt