Menu
CoddyTech

Resolusi Konflik Trait

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 53 dari 91.

Ketika dua trait mendefinisikan method dengan nama yang sama, PHP akan menimbulkan error fatal. Kamu harus memberi tahu PHP secara eksplisit cara menangani konflik ini menggunakan operator insteadof dan as.

<?php
trait FileLogger {
    public function log(string $message): void {
        echo "File: $message";
    }
}

trait DatabaseLogger {
    public function log(string $message): void {
        echo "DB: $message";
    }
}

class Application {
    use FileLogger, DatabaseLogger {
        FileLogger::log insteadof DatabaseLogger;
        DatabaseLogger::log as logToDatabase;
    }
}

$app = new Application();
$app->log("Error occurred");
$app->logToDatabase("Error occurred");

Output:

File: Error occurred
DB: Error occurred

Operator insteadof memilih method trait mana yang digunakan saat terjadi konflik. Dalam contoh ini, FileLogger::log menang dan menjadi method log() default. Operator as membuat alias, sehingga kamu bisa mengakses method trait lainnya dengan nama yang berbeda.

Kamu juga dapat menggunakan as untuk mengubah visibilitas method:

<?php
trait Greeting {
    public function sayHello(): void {
        echo "Hello!";
    }
}

class Person {
    use Greeting {
        sayHello as private;
    }
}

Ini membuat sayHello() bersifat privat di dalam class Person, meskipun bersifat publik di trait. Resolusi konflik memberimu kendali yang lebih terperinci atas cara method trait diintegrasikan ke dalam class-mu.

challenge icon

Tantangan

Mudah

Mari kita buat sistem notifikasi dengan berbagai channel yang dapat mengirim pesan, tetapi kita perlu menyelesaikan konflik ketika beberapa trait menyediakan nama method yang sama.

Kamu akan mengatur kodemu dalam empat file:

  • EmailNotifier.php: Buat trait bernama EmailNotifier dengan method notify(string $message) yang mengembalikan "Email: [message]".
  • SmsNotifier.php: Buat trait bernama SmsNotifier dengan method notify(string $message) yang mengembalikan "SMS: [message]".
  • AlertService.php: Buat class AlertService yang menggunakan kedua trait. Karena kedua trait memiliki method notify(), kamu perlu menyelesaikan konflik ini:
    • Gunakan EmailNotifier::notify sebagai method notify() default
    • Buat alias notifyBySms untuk method SmsNotifier::notify
    Tambahkan juga method notifyAll(string $message) yang memanggil kedua method notifikasi dan mengembalikan hasilnya dalam baris terpisah.
  • main.php: Sertakan semua file yang diperlukan dan buat instance AlertService. Kamu akan menerima satu input: string pesan. Cetak tiga baris:
    • Hasil pemanggilan notify() dengan pesan tersebut
    • Hasil pemanggilan notifyBySms() dengan pesan tersebut
    • Hasil pemanggilan notifyAll() dengan pesan tersebut

Contoh ini menunjukkan cara insteadof menentukan method dari trait mana yang digunakan saat terjadi konflik nama, sedangkan as memungkinkan kamu tetap mengakses method dari trait lainnya dengan nama berbeda.

Coba sendiri

<?php
require_once 'AlertService.php';

// Baca input
$message = trim(fgets(STDIN));

// TODO: Buat instance AlertService

// TODO: Cetak hasil pemanggilan notify() dengan pesan tersebut

// TODO: Cetak hasil pemanggilan notifyBySms() dengan pesan tersebut

// TODO: Cetak hasil pemanggilan notifyAll() dengan pesan tersebut
?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online