use ile trait kullanma
use ile bir sınıfa trait methodlarını dahil etmeyi öğrenirsin.
use ile trait'i sınıfa dahil etme
Trait'i tanımladın; şimdi onu bir sınıfta kullanalım. Sınıf gövdesinin içine use TraitAdi; yazarsın. Bu satır, trait'in metotlarını sınıfa enjekte eder; sanki metodları sınıfın içine elle yazmışsın gibi çalışır.
Örnek:
class User {
use Greeter;
}
$u = new User();
echo $u->hello(); // MerhabaBu use, sınıf gövdesi içinde ve bir trait adıyla kullanılır.
Method injection: trait metodu sınıfta çalışır
use Greeter; yazdığında Greeter trait'inin hello() metodu artık User sınıfına dahil olur. Buna method injection denir. $u->hello() çağrısı trait'teki metodu çalıştırır.
Trait'ler property de içerebilir; bu property'ler de sınıfa enjekte olur. Böylece ortak durum ve davranışı tek yerde tutup birçok sınıfa yayabilirsin.
Önemli nokta: trait new ile örneklenemez; yalnızca bir sınıf use ile onu kullanır.
Uygulama Logger trait'ini Service sınıfında kullan
Bir Logger trait'i tanımla: public function log(string $msg): string metodu return "[LOG] " . $msg; döndürsün. Sonra Service sınıfı use Logger; ile trait'i kullansın. $s = new Service() ile örnek oluştur ve echo $s->log("çalışıyor") . "\n"; ile çıktı yazdır.
Örnek çözümü göster
string { ... } } yaz. Sonra class Service { use Logger; } ekle. $s = new Service(); ile $s->log("çalışıyor") çağır.
Örnek çözüm:
<?php
// Logger trait'ini tanımla ve Service sınıfında kullan
trait Logger {
public function log(string $msg): string {
return "[LOG] " . $msg;
}
}
class Service {
use Logger;
}
$s = new Service();
echo $s->log("çalışıyor") . "\n";
Kendini test et
-
use TraitAdi; satırı nereye yazılır?
- new ile örnek oluştururken
- trait tanımının içinde
- Sınıf gövdesinin içinde, metotların dışında
- Sınıf adından hemen sonra parantez içinde
Cevabı göster
Sınıf gövdesinin içinde, metotların dışında — Doğru. use satırı sınıf gövdesinin içinde, metot tanımlarından ayrı bir blok olarak yazılır.
-
Sınıfa trait'i dahil et
trait Greeter { public function hello(): string { return "Merhaba"; } } class User { ____ Greeter; } $u = new User(); echo $u->hello() . "\n";Cevabı göster
trait Greeter { public function hello(): string { return "Merhaba"; } } class User { use Greeter; } $u = new User(); echo $u->hello() . "\n"; -
class User { use Greeter; } sonrası $u->hello() ne yazdırır?
- Merhaba
- Hata verir
- Greeter
- User
Cevabı göster
Merhaba — Doğru. use Greeter; hello() metodunu User'a enjekte eder; bu yüzden Merhaba yazdırılır.