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.