Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

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 şekliDikkat edilmesi gereken
TraitOrtak davranışı sınıflara eklemekuse TraitAdi;Trait tek başına örneklenemez
KalıtımBir sınıfın başka sınıfın özelliklerini genişletmesiclass Alt extends UstSınıflar arasında güçlü bağlılık oluşturur
InterfaceBir sınıfın uyması gereken metot sözleşmesini tanımlamakimplements InterfaceAdiMetotları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​


  1. Tekrarlanan davranışı belirleyin ve bu davranışın hangi sınıflarda gerçekten ortak olduğunu kontrol edin.
  2. Trait'i anlamlı bir adla tanımlayın; örneğin Loggable veya FormatsDates.
  3. Ortak metotları trait içine taşıyın ve kullandıkları bağımlılıkları açıkça tanımlayın.
  4. Trait'i ilgili sınıfta use TraitAdi; ile etkinleştirin.
  5. Sınıfı oluşturarak trait metodunu çağırın ve beklenen sonucu test edin.
  6. Aynı metot adını kullanan başka trait'ler varsa çakışmayı insteadof veya as ile çö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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.