Penyelesaian Konflik Metode Trait dalam OOP di PHP
Karena satu kelas dapat menggunakan beberapa trait, maka kita mungkin menghadapi masalah yang muncul ketika dua trait memiliki metode dengan nama yang sama.
Dalam hal ini, PHP akan menghasilkan error fatal. Untuk memperbaiki situasi, kita perlu menyelesaikan konflik nama secara eksplisit. Bagaimana cara melakukannya - mari kita lihat dalam praktik.
Misalkan kita memiliki dua trait dengan
metode method yang sama:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
Misalkan kita juga memiliki kelas Test,
yang menggunakan kedua trait kita. Jika hanya
menghubungkan kedua trait ke kelas kita, maka
PHP akan menghasilkan error, karena trait memiliki
metode yang bertabrakan:
<?php
// Kode ini akan menghasilkan error!
class Test
{
use Trait1, Trait2; // menghubungkan trait
}
?>
Mari kita selesaikan konflik nama
trait kita. Untuk itu ada operator khusus
insteadof. Dengan operator ini
kita akan menggunakan metode method dari trait
Trait1 alih-alih metode yang sama dari trait
Trait2:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
Seperti yang Anda lihat, sintaksnya adalah sebagai berikut: pertama
nama trait, lalu dua titik dua, lalu nama
metode, lalu operator kita 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 menampilkan 1, karena ini adalah metode trait pertama
}
}
new Test;
?>
Jadi, dalam kelas kita, kita mengatakan bahwa jika
metode method digunakan, maka harus
diambil dari trait pertama. Bisa juga sebaliknya
- mengambil metode dari trait kedua:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // akan menampilkan 2, karena ini adalah metode trait kedua
}
}
new Test;
?>
Bagaimanapun juga, jika kita menentukan untuk menggunakan
metode dari satu trait, maka metode dari trait kedua
menjadi tidak dapat diakses. Kita dapat menggunakan
metode dari trait kedua, dengan mengganti namanya
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 menampilkan 3
}
}
new Test;
?>
Jika diinginkan, kita juga bisa mengganti nama metode dari trait pertama:
<?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 menampilkan 3
}
}
new Test;
?>
Menggunakan kata kunci as tanpa
mendefinisikan metode utama melalui insteadof
tidak diperbolehkan, ini akan menghasilkan error:
<?php
// Kelas ini akan menghasilkan error:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Buatlah 3 trait dengan nama Trait1,
Trait2 dan Trait3. Misalkan pada trait pertama
ada metode method yang mengembalikan
1, pada trait kedua - metode dengan nama sama
yang mengembalikan 2, dan pada trait ketiga
- metode dengan nama sama,
yang mengembalikan 3.
Buatlah kelas Test yang menggunakan
ketiga trait yang telah kita buat. Buatlah dalam
kelas ini metode getSum yang mengembalikan
jumlah hasil metode dari trait yang terhubung.