Trait'lere Giriş
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 51 / 91.
PHP yalnızca tekli kalıtımı destekler - bir sınıf yalnızca bir üst sınıfı genişletebilir. Peki işlevselliği birbiriyle ilişkili olmayan birden fazla sınıf arasında paylaşmanız gerekirse ne olur? İşte trait'ler burada devreye girer.
Trait, kodun yeniden kullanılmasını sağlayan ve birden fazla sınıfa eklenebilecek metotlar ile özellikler tanımlamanıza olanak veren bir mekanizmadır. Trait’leri dil düzeyinde kopyala-yapıştır işlemi gibi düşünebilirsiniz; bir trait’teki kod, onu kullanan sınıfın bir parçası hâline gelir.
<?php
trait Timestampable {
private string $createdAt;
public function setCreatedAt(): void {
$this->createdAt = date('Y-m-d H:i:s');
}
public function getCreatedAt(): string {
return $this->createdAt;
}
}
class Article {
use Timestampable;
public function __construct(public string $title) {
$this->setCreatedAt();
}
}
$article = new Article("PHP Traits");
echo $article->getCreatedAt();
Bir sınıfın içindeki use anahtar sözcüğü, trait'in üyelerini içe aktarır. Artık Article, setCreatedAt() ve getCreatedAt() üyelerine, sanki doğrudan sınıfta tanımlanmışlar gibi erişebilir.
Aynı trait, tamamen ilgisiz sınıflarda da kullanılabilir - bir Comment sınıfı, bir User sınıfı veya zaman damgası işlevselliğine ihtiyaç duyan herhangi başka bir sınıf. Bu, sınıf hiyerarşiniz genelinde yatay kod paylaşımına olanak tanıyarak tekli kalıtımın sınırlamasını çözer.
Görev
Kolayİlişkisiz sınıflar arasında işlevselliği paylaşmanıza olanak tanıyan trait'lerin nasıl çalıştığını gösteren basit bir selamlama sistemi oluşturalım. Selamlama özelliği sağlayan bir trait oluşturacak, ardından bunu birbirinden tamamen farklı iki sınıfta kullanacaksınız.
Kodunuzu üç dosyaya düzenleyeceksiniz:
Greetable.php: Selamlama işlevselliği sağlayanGreetableadlı bir trait oluşturun. Trait şunlara sahip olmalıdır:- Özel bir
$greetingözelliği (string) - Selamlama mesajını depolayan
setGreeting(string $greeting)yöntemi - Selamlama mesajını döndüren
greet()yöntemi
- Özel bir
Person.php:Greetabletrait'ini kullanan birPersonsınıfı oluşturun. Trait dosyasını dahil edin ve genel bir$nameözelliği tanımlamak için kurucu destekli özellik tanımlamayı kullanın. Kurucuda, selamlamayı"Hello, I'm [name]"olarak ayarlamak içinsetGreeting()yöntemini çağırın.Robot.php:Greetabletrait'ini kullanan birRobotsınıfı da oluşturun. Trait dosyasını dahil edin ve genel bir$modelözelliği tanımlamak için kurucu destekli özellik tanımlamayı kullanın. Kurucuda, selamlamayı"Beep boop, I am model [model]"olarak ayarlamak içinsetGreeting()yöntemini çağırın.
main.php dosyasında her iki sınıf dosyasını da dahil edin. İki girdi alacaksınız: bir kişinin adı ve bir robotun model numarası. Her iki sınıftan da örnekler oluşturun ve selamlamalarını ayrı satırlara yazdırın.
Bu, trait'lerin gücünü gösterir: Person ve Robot, ortak bir üst sınıfa sahip olmayan, tamamen ilişkisiz sınıflardır; ancak trait aracılığıyla ikisi de aynı selamlama işlevselliğini kazanır. Her sınıf, bu işlevselliği kendi yöntemine göre özelleştirir.
Kendin dene
<?php
require_once 'Person.php';
require_once 'Robot.php';
// Girdiyi oku
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));
// TODO: Verilen isimle bir Person örneği oluştur
// TODO: Verilen modelle bir Robot örneği oluştur
// TODO: Person'ın selamlamasını yazdır
// TODO: Robot'un selamlamasını yazdır (yeni bir satırda)
?>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