Trait vs inheritance
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
-
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.
-
İ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"; -
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ı