CodeBlanks Logo Icon CodeBlanks

Özet - Trait'ler

PHP kursu · Orta seviye · Ders 64/115

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 insteadof seçer, as takma 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 new ile örneklenemez; yalnızca use ile 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

  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;
    Cevabı göster

    use Logger, Notifier; — Doğru. use Logger, Notifier; ile iki trait virgülle birleştirilir ve sınıfa dahil edilir.

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

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