- Konu sahibi
- #1
PHP trait nedir?
PHP trait, ortak metot veya özellikleri birden fazla sınıfa tekrar yazmadan eklemek için kullanılan yeniden kullanılabilir bir kod parçasıdır. Trait tek başına nesne olarak oluşturulamaz; bir sınıfın içinde
use ile kullanılır. Bu yönüyle kalıtımın yerine geçmez, ancak bir sınıfın birden fazla ortak davranışı edinmesini sağlar.Trait nasıl çalışır?
Trait içindeki metotlar, onu kullanan sınıfın parçası gibi kullanılabilir. Sınıf, trait'in metotlarını doğrudan çağırır ve trait içindeki
$this ifadesi o sınıfın mevcut nesnesini gösterir.Aşağıdaki örnek, bir servis sınıfına log mesajı üretme davranışı ekler:
Kod:
<?php
trait Loggable
{
public function log(string $message): string
{
return '[LOG] ' . $message;
}
}
class OrderService
{
use Loggable;
public function create(): string
{
return $this->log('Sipariş oluşturuldu');
}
}
$service = new OrderService();
echo $service->create();
Dosyayı
trait-example.php adıyla kaydedip PHP'nin çalışabildiği bir ortamda çalıştırdığınızda beklenen çıktı şudur:
Kod:
[LOG] Sipariş oluşturuldu
Bu çıktıyı alıyorsanız
OrderService sınıfı trait içindeki log metodunu kullanmıştır. unexpected token veya benzeri bir sözdizimi hatası alırsanız önce trait, use, süslü parantezler ve noktalı virgülleri kontrol edin. Trait'i doğrudan new Loggable() ile oluşturmaya çalışmak ise doğru değildir; trait sınıf değildir.Trait ne zaman tercih edilir?
Trait kullanmadan önce davranışın gerçekten birden fazla, birbiriyle ilişkili olmayan sınıfta ortak olup olmadığını değerlendirin. Örneğin loglama, olay yayınlama veya ortak bir dönüştürme işlemi trait için uygun olabilir. Ancak trait çok fazla bağımlılık taşıyorsa veya önemli iş kurallarını gizliyorsa ayrı bir servis sınıfı daha anlaşılır olur.
Aşağıdaki karşılaştırma karar vermeyi kolaylaştırır:
| Yapı | Temel amacı | Kullanım şekli | Dikkat edilmesi gereken |
|---|---|---|---|
| Trait | Ortak davranışı sınıflara eklemek | use TraitAdi; | Trait tek başına örneklenemez |
| Kalıtım | Bir sınıfın başka sınıfın özelliklerini genişletmesi | class Alt extends Ust | Sınıflar arasında güçlü bağlılık oluşturur |
| Interface | Bir sınıfın uyması gereken metot sözleşmesini tanımlamak | implements InterfaceAdi | Metotların gövdesini normalde sağlamaz |
Aynı sınıfa eklenen iki trait aynı isimli metodu getirirse ve tercih açıkça belirtilmezse çakışma oluşur. Sınıfın kendi metodu ise trait metoduna, trait metodu üst sınıftan gelen metoda önceliklidir. Böyle bir durumda hangi davranışın kullanılacağını açıkça belirlemek gerekir. Trait metotları
insteadof ile birbirine tercih edilebilir; as ile bir metoda ek ad veya farklı görünürlük verilebilir. Bu yapı karmaşıklaşırsa ortak kodu tek bir sınıfa taşıyıp diğer sınıflara bağımlılık olarak vermek genellikle daha kolay takip edilir.Uygularken kontrol listesi
- Tekrarlanan davranışı belirleyin ve bu davranışın hangi sınıflarda gerçekten ortak olduğunu kontrol edin.
- Trait'i anlamlı bir adla tanımlayın; örneğin
LoggableveyaFormatsDates. - Ortak metotları trait içine taşıyın ve kullandıkları bağımlılıkları açıkça tanımlayın.
- Trait'i ilgili sınıfta
use TraitAdi;ile etkinleştirin. - Sınıfı oluşturarak trait metodunu çağırın ve beklenen sonucu test edin.
- Aynı metot adını kullanan başka trait'ler varsa çakışmayı
insteadofveyaasile çözün.
Trait, kod tekrarını azaltan bir araçtır; veritabanı bağlantısı veya global değişken gibi gizli bağımlılıkları ortadan kaldırmaz. Bir trait belirli bir sınıf özelliğinin, servisin veya global durumun varlığına güveniyorsa, bu önkoşulu metot imzası ve sınıf tasarımıyla görünür kılın. Aksi durumda trait'i kullanan sınıflar ilk bakışta çalışması için hangi dış koşullara ihtiyaç duyduğunu belli etmeyebilir.
Sık sorulan sorular
Bir sınıf birden fazla trait kullanabilir mi?
Evet. Sınıf içinde birden fazla trait virgülle ayrılarak kullanılabilir:
use Loggable, FormatsDates;. Metot adları çakışıyorsa tercih sırası açıkça tanımlanmalıdır.Trait ile interface aynı şey midir?
Hayır. Trait kullanılabilir metot gövdeleri sağlayarak davranış ekler. Interface ise sınıfın uygulaması gereken metot sözleşmesini tanımlar; tek başına ortak uygulama kodu sağlama amacı taşımaz.
Trait başka bir trait'i kullanabilir mi?
Evet. Bir trait içinde başka bir trait için
use kullanılabilir. Ancak bu durum bağımlılık zincirini büyüteceği için kullanılan trait'lerin sorumluluklarını açık ve sınırlı tutmak gerekir.