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 occurredOperator 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.
Tantangan
MudahMari 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 bernamaEmailNotifierdengan methodnotify(string $message)yang mengembalikan"Email: [message]".SmsNotifier.php: Buat trait bernamaSmsNotifierdengan methodnotify(string $message)yang mengembalikan"SMS: [message]".AlertService.php: Buat classAlertServiceyang menggunakan kedua trait. Karena kedua trait memiliki methodnotify(), kamu perlu menyelesaikan konflik ini:- Gunakan
EmailNotifier::notifysebagai methodnotify()default - Buat alias
notifyBySmsuntuk methodSmsNotifier::notify
notifyAll(string $message)yang memanggil kedua method notifikasi dan mengembalikan hasilnya dalam baris terpisah.- Gunakan
main.php: Sertakan semua file yang diperlukan dan buat instanceAlertService. 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
- Hasil pemanggilan
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
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses Pembayaran9Trait
Pengantar TraitMenggunakan Beberapa TraitResolusi Konflik TraitMetode Abstrak dalam TraitTrait vs PewarisanLatihan sendiri: Compiler PHP online