Özet - Trait'ler
trait, use ve çoklu trait'le loglama özellikli sınıflar yazarsın.
Özet: Trait'ler
Bu grupta trait'leri öğrendin. Özetle:
trait Name { ... }ile yeniden kullanılabilir method kümesi tanımlarsın.- Sınıf içinde
use Name;ile trait'i dahil eder, metotları enjekte edersin. use A, B;ile birden çok trait'i birleştirirsin.- Aynı isimli metot çakışmasında
insteadofseçer,astakma ad verir. - Trait yatay yeniden kullanım; miras dikey 'is-a' ilişkisidir.
Uygulama Loglama özellikli UserService sınıfı
Bir Logger trait'i tanımla: public function log(string $msg): string metodu return "[LOG] " . $msg; döndürsün. Bir Tagger trait'i tanımla: public function tag(string $t): string metodu return "#" . $t; döndürsün. Sonra UserService sınıfı use Logger, Tagger; ile ikisini kullansın. $s = new UserService() ile örnek oluştur, echo $s->log("giriş") . "\n" ve echo $s->tag("admin") . "\n" çağrılarını yaz.
Örnek çözümü göster
trait Logger { ... } ve trait Tagger { ... } yaz. class UserService { use Logger, Tagger; } ekle. $s = new UserService(); ile log() ve tag() çağır.
Örnek çözüm:
<?php
// Logger ve Tagger trait'lerini UserService sınıfında birleştir
trait Logger {
public function log(string $msg): string {
return "[LOG] " . $msg;
}
}
trait Tagger {
public function tag(string $t): string {
return "#" . $t;
}
}
class UserService {
use Logger, Tagger;
}
$s = new UserService();
echo $s->log("giriş") . "\n";
echo $s->tag("admin") . "\n";
Trait kullanım ipuçları
Trait kullanırken birkaç ipucu:
- Trait
newile örneklenemez; yalnızcauseile sınıfa dahil edilir. - Trait'i küçük ve tek sorumluluklu tut; bir trait'e onlarca metod tıkma.
- Trait property'si sınıfa enjekte olur; çakışırsa dikkat et.
- Gerçek 'is-a' ilişkisi varsa mirası tercih et; trait davranış paylaşımı içindir.
Tasarım kararında 'bu bir ... midir' mi, 'bu ... yapabilir mi' mi sorusu yol gösterir.
Kendini test et
-
Bir sınıfa hem Logger hem Notifier eklemenin doğru yazımı?
- use Logger extends Notifier;
- extends Logger, Notifier;
- implements Logger, Notifier;
- use Logger, Notifier;
Cevabı göster
use Logger, Notifier; — Doğru. use Logger, Notifier; ile iki trait virgülle birleştirilir ve sınıfa dahil edilir.
-
Anahtar kelimeyi görevine eşleştir
- trait
- yeniden kullanılabilir method kümesi
- use
- sınıfa trait dahil etme
- insteadof
- çakışan metodu seçme
- as
- metoda yeni ad verme
-
as ile metoda takma ad ver
trait Printer { public function output(): string { return "çıktı"; } } class Report { use Printer { output ____ asText; } } $r = new Report(); echo $r->asText() . "\n";Cevabı göster
trait Printer { public function output(): string { return "çıktı"; } } class Report { use Printer { output as asText; } } $r = new Report(); echo $r->asText() . "\n";