Özet - Trait'ler
- PHP kursu
- Orta seviye
- Ders 64/115
- 5 dk
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.
Başlangıç kodu
<?php
// Logger ve Tagger trait'lerini UserService sınıfında birleştirÖ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";Beklenen çıktı
[LOG] giriş #admin
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.
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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; Doğru cevap
Açıklama: use Logger, Notifier; ile iki trait virgülle birleştirilir ve sınıfa dahil edilir.
2 Anahtar kelimeyi görevine eşleştir
| Kavram | Anlamı |
|---|---|
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 |
3 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";
trait Printer {
public function output(): string {
return "çıktı";
}
}
class Report {
use Printer {
output as asText;
}
}
$r = new Report();
echo $r->asText() . "\n";
Açıklama: output as asText; ile metoda asText takma adı verilir; $r->asText() çalışır.