Trait Çakışma Çözümü
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 53 / 91.
İki trait aynı isme sahip metotlar tanımladığında, PHP ölümcül bir hata (fatal error) verir. Bu çakışmanın nasıl ele alınacağını insteadof ve as operatörlerini kullanarak PHP'ye açıkça belirtmelisiniz.
<?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 metodunun kullanılacağını seçer. Bu örnekte, FileLogger::log kazanır ve varsayılan log() metodu olur. as operatörü bir takma ad oluşturarak diğer trait'in metoduna farklı bir isimle erişmenizi sağlar.
Bir metodun görünürlüğünü değiştirmek için as ifadesini de kullanabilirsiniz:
<?php
trait Greeting {
public function sayHello(): void {
echo "Hello!";
}
}
class Person {
use Greeting {
sayHello as private;
}
}
Bu, sayHello() metodunu, trait içinde public olmasına rağmen Person sınıfı içinde private yapar. Çakışma çözümü, trait metotlarının sınıflarınıza nasıl entegre edileceği üzerinde size ince ayarlı kontrol sağlar.
Görev
KolayFarklı kanalların mesaj gönderebildiği bir bildirim sistemi kuralım, ancak birden fazla trait aynı metot adını sağladığında oluşacak çakışmaları çözmemiz gerekiyor.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
EmailNotifier.php—"Email: [message]"döndürennotify(string $message)metoduna sahipEmailNotifieradında bir trait oluşturun.SmsNotifier.php—"SMS: [message]"döndürennotify(string $message)metoduna sahipSmsNotifieradında bir trait oluşturun.AlertService.php— Her iki traiti de kullanan birAlertServicesınıfı oluşturun. Her iki trait de birnotify()metoduna sahip olduğundan, bu çakışmayı çözmeniz gerekecek:- Varsayılan
notify()metodu olarakEmailNotifier::notifykullanın SmsNotifier::notifymetodu içinnotifyBySmsadında bir takma ad (alias) oluşturun
notifyAll(string $message)metodu 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:- Mesaj ile
notify()çağırmanın sonucu - Mesaj ile
notifyBySms()çağırmanın sonucu - Mesaj ile
notifyAll()çağırmanın sonucu
- Mesaj ile
Bu, bir isimlendirme çakışması olduğunda insteadof anahtar kelimesinin hangi trait metodunun kazanacağını nasıl belirlediğini, as anahtar kelimesinin ise diğer trait metoduna farklı bir isimle erişmenizi nasıl sağladığını gösterir.
Kopya kağıdı
Birden fazla trait aynı isme sahip metotlar tanımladığında, PHP insteadof ve as operatörlerini kullanarak açık bir çakışma çözümü gerektirir.
insteadof operatörü, hangi trait'in metodunun varsayılan olarak kullanılacağını seçer:
<?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"); // File: Error occurred
$app->logToDatabase("Error occurred"); // DB: Error occurred
as operatörü, bir trait metodu için takma ad (alias) oluşturarak farklı bir isim altında erişim sağlar.
as operatörünü metot görünürlüğünü değiştirmek için de kullanabilirsiniz:
<?php
trait Greeting {
public function sayHello(): void {
echo "Hello!";
}
}
class Person {
use Greeting {
sayHello as private;
}
}
Kendin dene
<?php
require_once 'AlertService.php';
// Girdiyi oku
$message = trim(fgets(STDIN));
// YAPILACAK: Bir AlertService örneği oluşturun
// YAPILACAK: Mesaj ile notify() çağırma sonucunu yazdırın
// YAPILACAK: Mesaj ile notifyBySms() çağırma sonucunu yazdırın
// YAPILACAK: Mesaj ile notifyAll() çağırma sonucunu yazdırın
?>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 KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi