Trait Çakışmalarını Çözümleme
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 91.
İki trait aynı ada sahip yöntemler tanımladığında PHP kritik bir hata verir. insteadof ve as operatörlerini kullanarak PHP’ye bu çakışmayı nasıl ele alacağını açıkça belirtmelisin.
<?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");
Çıktı:
File: Error occurred
DB: Error occurredinsteadof operatörü, bir çakışma olduğunda hangi trait’in yönteminin kullanılacağını seçer. Bu örnekte FileLogger::log kazanır ve varsayılan log() yöntemi olur. as operatörü bir takma ad oluşturur ve diğer trait’in yöntemine farklı bir ad altında erişmenizi sağlar.
Bir yöntemin görünürlüğünü değiştirmek için as ifadesini de kullanabilirsin:
<?php
trait Greeting {
public function sayHello(): void {
echo "Hello!";
}
}
class Person {
use Greeting {
sayHello as private;
}
}
Bu, trait içinde public olsa bile sayHello() yöntemini Person sınıfı içinde private yapar. Çakışma çözümleme, trait yöntemlerinin sınıflarınıza nasıl entegre edileceği üzerinde ayrıntılı denetim sağlar.
Görev
KolayFarklı kanalların mesaj gönderebildiği bir bildirim sistemi oluşturalım; ancak birden fazla trait aynı yöntem adını sağladığında çakışmaları çözmemiz gerekiyor.
Kodunuzu dört dosyaya ayıracaksınız:
EmailNotifier.php:EmailNotifieradlı bir trait oluşturun ve"Email: [message]"döndürennotify(string $message)yöntemini ekleyin.SmsNotifier.php:SmsNotifieradlı bir trait oluşturun ve"SMS: [message]"döndürennotify(string $message)yöntemini ekleyin.AlertService.php: Her iki trait'i de kullanan birAlertServicesınıfı oluşturun. Her iki trait de birnotify()yöntemine sahip olduğundan bu çakışmayı çözmeniz gerekir:- Varsayılan
notify()yöntemi olarakEmailNotifier::notifykullanın SmsNotifier::notifyyöntemi içinnotifyBySmsadında bir takma ad oluşturun
notifyAll(string $message)yöntemini ekleyin.- Varsayılan
main.php: Gerekli tüm dosyaları dahil edin ve birAlertServiceörneği oluşturun. Bir girdi alacaksınız: bir mesaj dizesi. Üç satır yazdırın:- Mesajla birlikte
notify()çağrısının sonucu - Mesajla birlikte
notifyBySms()çağrısının sonucu - Mesajla birlikte
notifyAll()çağrısının sonucu
- Mesajla birlikte
Bu örnek, adlandırma çakışması olduğunda hangi trait yönteminin öncelikli olacağını insteadof kullanarak belirlemeyi, as kullanarak ise diğer trait'in yöntemine farklı bir ad altında erişmeye devam etmeyi gösterir.
Kendin dene
<?php
require_once 'AlertService.php';
// Girdiyi oku
$message = trim(fgets(STDIN));
// TODO: Bir AlertService örneği oluştur
// TODO: mesaj ile notify() çağrısının sonucunu yazdır
// TODO: mesaj ile notifyBySms() çağrısının sonucunu yazdır
// TODO: mesaj ile notifyAll() çağrısının sonucunu yazdır
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi