CodeBlanks Logo Icon CodeBlanks

use ile trait kullanma

PHP kursu · Orta seviye · Ders 60/115

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(); // Merhaba

Bu 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

  1. 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.

  2. 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";
  3. 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.

Orta seviye bölümündeki tüm dersler