CodeBlanks Logo Icon CodeBlanks

Trait vs inheritance

PHP kursu · Orta seviye · Ders 63/115

Trait ile miras arasındaki farkı ve ne zaman hangisini kullanacağını öğrenirsin.

Trait vs inheritance: dikey mi yatay mı?

PHP'de miras (inheritance) dikeydir: bir sınıf tek ebeveynden türetilir ve 'bir ...'dir' (is-a) ilişkisi kurar. Dog extends Animal derken 'Köpek bir Hayvandır' deriz.

Trait ise yataydır: 'bir ...'dir' demek yerine 'şu yeteneğe sahiptir' der. İlgisiz sınıflar aynı trait'i paylaşabilir. Üstelik bir sınıf birden çok trait kullanabilir; ama yalnızca tek sınıfı miras alır.

Ne zaman trait, ne zaman inheritance?

Ne zaman hangisi? Gerçek bir tür hiyerarşisi varsa miras seç: Cat extends Animal, Car extends Vehicle. Burada alt sınıf ebeveynin özelleşmiş halidir.

Davranış, sınıflar arasında akrabalık olmadan paylaşılacaksa trait seç: hem Robot hem Phone bir Battery trait'i kullanabilir; ikisini de ortak bir ebeveyne bağlamaya gerek yok.

Uygulama İki ilgisiz sınıfta yatay yeniden kullanım

Bir Timestamp trait'i tanımla: public function created(): string metodu return "oluşturuldu"; döndürsün. Sonra Article ve Comment sınıfları use Timestamp; ile trait'i kullansın (ikisi de ebeveynden türetilmemiş, ilgisiz). $a = new Article() ve $c = new Comment() ile örnekleri oluştur; echo $a->created() . "\n" ve echo $c->created() . "\n" çağrılarını yaz.

Örnek çözümü göster
string { ... } } yaz. Sonra class Article { use Timestamp; } ve class Comment { use Timestamp; } ekle. İki örneği oluştur ve created() çağır.
Örnek çözüm:
<?php
// Timestamp trait'ini iki ilgisiz sınıfta kullan
trait Timestamp {
    public function created(): string {
        return "oluşturuldu";
    }
}

class Article {
    use Timestamp;
}

class Comment {
    use Timestamp;
}

$a = new Article();
$c = new Comment();
echo $a->created() . "\n";
echo $c->created() . "\n";

Kendini test et

  1. Trait ve inheritance hakkında hangisi doğrudur?

    • Bir sınıf birden çok sınıfı miras alabilir ama bir trait kullanabilir
    • Bir sınıf birden çok trait kullanabilir ama yalnızca bir sınıfı miras alabilir
    • Trait ve inheritance tamamen aynıdır
    • Trait kullanınca extends gereksiz hale gelir
    Cevabı göster

    Bir sınıf birden çok trait kullanabilir ama yalnızca bir sınıfı miras alabilir — Doğru. PHP tek miraslıdır ama bir sınıf istediği kadar trait kullanabilir; bu yatay yeniden kullanımı sağlar.

  2. İlgisiz sınıfa trait dahil et

    trait Battery {
        public function charge(): string {
            return "şarj oluyor";
        }
    }
    
    class Robot {
        ____ Battery;
    }
    
    $r = new Robot();
    echo $r->charge() . "\n";
    Cevabı göster
    trait Battery {
        public function charge(): string {
            return "şarj oluyor";
        }
    }
    
    class Robot {
        use Battery;
    }
    
    $r = new Robot();
    echo $r->charge() . "\n";
  3. Kavramı kategorisine eşleştir

    Dog extends Animal
    miras (is-a)
    sınıf + use Battery
    yatay yeniden kullanım
    tek ebeveyn sınırı
    PHP miras sınırı
    çoklu trait birleştirme
    trait avantajı

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