Trait'ler ve Kalıtım Karşılaştırması
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 55 / 91.
Artık trait'lerin nasıl çalıştığını anladığınıza göre, trait'lerin kalıtıma kıyasla ne zaman kullanılacağını netleştirelim. Her ikisi de kodun yeniden kullanılmasına olanak tanır, ancak farklı amaçlara hizmet eder ve farklı özelliklere sahiptir.
Kalıtım, bir "bir türüdür" ilişkisi kurar. Animal sınıfını genişleten bir Dog sınıfı, bir köpeğin bir hayvan olduğu anlamına gelir. Alt sınıf, üst sınıfın kimliğini miras alır ve üst türün beklendiği her yerde kullanılabilir.
Trait'ler “has-a” yeteneği sağlar. Bir sınıf Loggable trait'ini kullandığında, günlük kaydı işlevine sahip olur — ancak bir günlük kaydı aracına dönüşmez. Trait'ler, sınıfın temelde ne olduğunu değiştirmeden davranış ekler.
<?php
// Kalıtım: Dog bir Animal'dır
class Animal {
public function breathe(): void {
echo "Breathing";
}
}
class Dog extends Animal {
public function bark(): void {
echo "Woof!";
}
}
// Trait: Dog loglama yeteneğine sahiptir
trait Loggable {
public function log(string $msg): void {
echo "Log: $msg";
}
}
class Cat extends Animal {
use Loggable;
}
Hatırlanması gereken temel farklar:
| Yön | Kalıtım | Trait'ler |
|---|---|---|
| İlişki | is-a | has-a yeteneği |
| Sınır | Yalnızca tek üst sınıf | Birden fazla trait'e izin verilir |
| Tür denetimi | instanceof ile çalışır | Tür kimliği yoktur |
| En uygun kullanım | Hiyerarşik ilişkiler | İlişkisiz sınıflar arasındaki ortak davranışlar |
Sınıflar ortak bir kimliği paylaştığında kalıtımı kullanın. Aynı aile ağacının parçası olmadan, birbiriyle ilgisiz sınıfların aynı işlevselliğe ihtiyaç duyduğu durumlarda özellikleri kullanın.
Görev
KolayKalıtım ile trait'lerin ne zaman kullanılacağını gösteren bir araç sistemi oluşturalım. Kalıtım yoluyla ortak bir kimliği paylaşan bir araç hiyerarşisi oluştururken, trait'ler aracılığıyla çapraz özellikler ekleyeceksin.
Kodunu dört dosyaya ayıracaksın:
Trackable.php: GPS izleme özelliği sağlayanTrackableadlı bir trait oluştur. Trait şunlara sahip olmalı:- Özel bir
$locationözelliği (string) - Geçerli konumu kaydeden
setLocation(string $location)metodu "Location: [location]"değerini döndürengetLocation()metodu
- Özel bir
Vehicle.php: "is-a" ilişkisini oluşturan temel birVehiclesınıfı oluştur. Trait dosyasını dahil et. Korumalı bir$brandözelliği tanımlamak için yapıcı destekli özellik tanımlamasını kullan."Vehicle: [brand]"değerini döndüren birdescribe()metodu ekle. Filomuzdaki tüm araçlar GPS'e sahip olacağından bu sınıfTrackabletrait'ini kullanmalı.Car.php:Vehiclesınıfını genişleten birCarsınıfı oluştur. Vehicle dosyasını dahil et. Markayı ve özel bir$doors(integer) özelliğini kabul etmek için yapıcı destekli özellik tanımlamasını kullan. Markayı üst sınıfın yapıcısına ilet.describe()metodunu,"Car: [brand] with [doors] doors"değerini döndürecek şekilde geçersiz kıl.main.php: Car dosyasını dahil et. Üç girdi alacaksın: bir marka adı, kapı sayısı ve bir konum dizesi. BirCarörneği oluştur, konumunu ayarla, ardından iki satır yazdır:describe()çağrısının sonucugetLocation()çağrısının sonucu
Kalıtım ile trait'lerin burada nasıl birlikte çalıştığına dikkat et: Car is a Vehicle'dır (kalıtım kimliği oluşturur), Vehicle ise izleme özelliğine has (trait davranış ekler). Bir şeyin araç olup olmadığını kontrol etmek için instanceof Vehicle kullanabilirsin; ancak karşılaştırabileceğin bir "Trackable" türü yoktur: bu, bu iki yaklaşım arasındaki temel farktır.
Kendin dene
<?php
// Ana dosya - Car örneğini oluştur ve test et
// TODO: Car.php dosyasını dahil et
// Girdileri oku
$brand = trim(fgets(STDIN));
$doors = intval(trim(fgets(STDIN)));
$location = trim(fgets(STDIN));
// TODO: brand ve doors ile bir Car örneği oluştur
// TODO: Arabanın konumunu ayarla
// TODO: describe() sonucunu yazdır
// TODO: getLocation() sonucunu yazdır
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi