CodeBlanks Logo Icon CodeBlanks

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

Başlangıç kodu

index.php
<?php
// Logger ve Tagger trait'lerini UserService sınıfında birleştir

Örnek çözüm

index.php
<?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 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.

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

Soru
trait Printer {
    public function output(): string {
        return "çıktı";
    }
}

class Report {
    use Printer {
        output ____ asText;
    }
}

$r = new Report();
echo $r->asText() . "\n";
Cevap
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.

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