Çoklu trait
Bir sınıfa birden fazla trait kullanarak yetenek birleştirmeyi öğrenirsin.
Birden fazla trait kullanma
Bir sınıfa birden fazla trait eklemek mümkündür. use satırında trait adlarını virgülle ayırırsın: use Logger, Notifier;. Sınıf, her iki trait'in metotlarını da kazanır.
Örnek:
class Order {
use Logger, Notifier;
}
$o = new Order();
$o->log("kayıt");
$o->notify("gönderildi");Bu sayede bir sınıfın yeteneklerini küçük, odaklı trait'lerden bileştirebilirsin.
Trait bileşimi (composition)
Çoklu trait kullanımı, sınıf tasarımında bileşimi (composition) güçlendirir. Her trait tek bir sorumluluk taşır: Logger kaydeder, Notifier bildirir, Cache önbelleğe alır. Sınıf, ihtiyacı olan trait'leri seçip birleştirir.
Bu yaklaşım, büyük bir ebeveyn sınıftan her şeyi miras almaktan daha esnektir. Her davranışı ayrı trait'te tutmak, bakımı ve testi kolaylaştırır.
Uygulama Logger ve Notifier'ı Order sınıfında birleştir
Bir Logger trait'i tanımla: public function log(string $m): string metodu return "[LOG] " . $m; döndürsün. Bir Notifier trait'i tanımla: public function notify(string $m): string metodu return "[BİLDİRİM] " . $m; döndürsün. Sonra Order sınıfı use Logger, Notifier; ile ikisini kullansın. $o = new Order() ile örnek oluştur, echo $o->log("sipariş alındı") . "\n" ve echo $o->notify("kargoya verildi") . "\n" çağrılarını yaz.
Örnek çözümü göster
Önce trait Logger { ... } ve trait Notifier { ... } yaz. Sonra class Order { use Logger, Notifier; } ekle. $o = new Order(); ile her iki metodu çağır.
Örnek çözüm:
<?php
// Logger ve Notifier trait'lerini tanımla, Order sınıfında birleştir
trait Logger {
public function log(string $m): string {
return "[LOG] " . $m;
}
}
trait Notifier {
public function notify(string $m): string {
return "[BİLDİRİM] " . $m;
}
}
class Order {
use Logger, Notifier;
}
$o = new Order();
echo $o->log("sipariş alındı") . "\n";
echo $o->notify("kargoya verildi") . "\n";
Kendini test et
-
Logger ve Notifier trait'lerini bir sınıfa eklemenin doğru yazımı?
- use Logger extends Notifier;
- use Logger, Notifier;
- class Order extends Logger, Notifier
- use Logger -> Notifier;
Cevabı göster
use Logger, Notifier; — Doğru. use satırında trait adları virgülle ayrılır: use Logger, Notifier;
-
Çoklu trait kullanımını tamamla
trait Logger { public function log() { return "log"; } } trait Notifier { public function notify() { return "bildirim"; } } class Order { use Logger, ____; } $o = new Order(); echo $o->notify() . "\n";Cevabı göster
trait Logger { public function log() { return "log"; } } trait Notifier { public function notify() { return "bildirim"; } } class Order { use Logger, Notifier; } $o = new Order(); echo $o->notify() . "\n"; -
Trait ile yeteneğini eşleştir
- Logger
- olay kaydı
- Notifier
- bildirim gönderme
- Serializer
- nesneyi metne çevirme
- Cache
- geçici saklama