⊗ppOpTrMC 79 of 107 menu

Penyelesaian Konflik Kaedah Trait dalam OOP PHP

Memandangkan satu kelas boleh menggunakan beberapa trait, kita mungkin menghadapi masalah yang timbul apabila dua trait mempunyai kaedah yang sama nama.

Dalam kes ini, PHP akan memaparkan ralat fatal. Untuk membetulkan keadaan, konflik nama perlu diselesaikan secara eksplisit. Bagaimana ia dilakukan - mari kita lihat dalam praktik.

Katakan kita mempunyai dua trait dengan kaedah method yang sama:

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

Katakan juga kita mempunyai kelas Test, yang menggunakan kedua-dua trait kami. Jika hanya menyambungkan kedua-dua trait ke kelas kami, maka PHP akan memaparkan ralat, kerana trait mempunyai kaedah yang bertindih:

<?php // Kod ini akan memaparkan ralat! class Test { use Trait1, Trait2; // menyambungkan trait } ?>

Mari selesaikan konflik nama trait kami. Untuk ini terdapat operator khas insteadof. Dengan menggunakan operator ini, kami akan menggunakan kaedah method trait Trait1 dan bukannya kaedah yang sama bagi trait Trait2:

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

Seperti yang anda lihat, sintaks di sini adalah seperti berikut: pertama nama trait, kemudian dua titik bertindih, kemudian nama kaedah, kemudian operator kami insteadof dan nama trait kedua.

Mari kita uji:

<?php class Test { use Trait1, Trait2 { Trait1::method insteadof Trait2; } public function __construct() { echo $this->method(); // akan papar 1, kerana ini kaedah trait pertama } } new Test; ?>

Jadi, dalam kelas kami kami berkata bahawa jika kaedah method digunakan, maka ia perlu diambil dari trait pertama. Boleh juga sebaliknya - ambil kaedah trait kedua:

<?php class Test { use Trait1, Trait2 { Trait2::method insteadof Trait1; } public function __construct() { echo $this->method(); // akan papar 2, kerana ini kaedah trait kedua } } new Test; ?>

Walau apa pun, jika kami nyatakan untuk menggunakan kaedah satu trait, maka kaedah trait kedua menjadi tidak boleh diakses. Boleh menggunakan kaedah trait kedua juga, dengan menamakan semula melalui kata kunci as, seperti ini:

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

Jika mahu, boleh menamakan semula kaedah trait pertama juga:

<?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(); // akan papar 3 } } new Test; ?>

Menggunakan kata kunci as tanpa menentukan kaedah utama melalui insteadof tidak dibenarkan, ini akan memaparkan ralat:

<?php // Kelas ini akan memaparkan ralat: class Test { use Trait1, Trait2 { Trait1::method as method1; Trait2::method as method2; } public function __construct() { echo $this->method1() + $this->method2(); } } new Test; ?>

Buat 3 trait dengan nama Trait1, Trait2 dan Trait3. Biarkan dalam trait pertama ada kaedah method, yang mengembalikan 1, dalam trait kedua - kaedah sama nama yang mengembalikan 2, dan dalam trait ketiga - kaedah sama nama, yang mengembalikan 3.

Buat kelas Test, yang menggunakan ketiga-tiga trait yang kami buat. Buat dalam kelas ini kaedah getSum, yang mengembalikan jumlah hasil kaedah trait yang disambungkan.

Melayu
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Kami menggunakan kuki untuk operasi laman web, analisis dan personalisasi. Pemprosesan data dijalankan mengikut Polisi Kerahsiaan.
terima semua tataletak tolak