PHP'de Trait Kullanımı

PHP'de Trait Kullanımı

Hepinize merhaba dostlarım 😊. Bu yazımda sizlere OOP konusunun bir parçası olan, birden fazla class lar ile çalışacağımız durumlarda (özellikle extends edileceği durumlarda) karşılaşılan hataya karşı geliştirilmiş bir çözüm olan, büyük projelerin vazgeçilmezi olan ve sizlerin de özellikle öğrenme süreci içerisinde bunu bol pratik yaparak kavramanızı istediğim konuyu yani Trait konusundan PHP programlama dili üzerinde anlatacağım. Normalde bu Trait konusu OOP üzerinde sadece PHP programlama diline ait değildir yani OOP (Object Oriented Programming) üzerinde olan ve C#, Java gibi programlama dilleri üzerinde de kullanılan bir yapıdır 😊. Biraz heyecanlandığınızı seziyorum özellikle OOP konusunda yeniyseniz bu terim biraz yabancı gelebilir. O halde sözümü daha fazla uzatmadan hemen konumuza girişimizi yapalım 😊

Trait Nedir ?

Eveeet dostlarım konumuza ufaktan ufaktan girişimizi yapmış bulunmaktayız 😊. Şimdi her zamanki gibi teorik bir anlatımdan uzak durarak işin mantığını anlatmak istiyorum. Türkçe karşılığı "Kişisel Özellik" olan trait e bakacak olursak bizim projemiz üzerinde oluşturduğumuz bir class ı başka bir class üzerinden extends ettiğimiz durumlar olduğundan daha önceki yazılarımda bahsetmiştim (okumayan dostlarım için buraya link bıraktım). Ama bazı durumlarda tek bir class üzerinden extends etmek yerine birden fazla class üzerinden extends etme durumları olabiliyor. Örnek vermemiz gerekirse bir Ürünler class ı oluşturmak istiyoruz varsayalım ama bunu da Stoklar ve Cariler isimli class lardan extends alarak yani ürün class ı üzerinden yeri geldiğince stoktan düşme işlemi için Stoklar class ına gitmeyi, yeni bir cari oluşturmak için ise Cariler class ına gitmemiz gerektiği durumlar olabiliyor ama bunu da extends ederken hata alıyoruz. Hadi tek class tan extends edeceksek sorun yok 😉. Gelin bunu hızlıca örnek üzerinden inceleyelim

<?php

class Stoklar{
    
}

class Urunler extends Stoklar {
    
}

şeklinde kodu yazıp çalıştırdığımızda hiçbir sorun olmaz çalışır ve kod burada şu şekilde okunur: "Urunler sınıfı dostum sen Stoklar sınıfından türetilmişsin 😊". 

Ama birden fazla classı extends edeceğimiz durumlarda ise aşağıdaki gibi sonuçla karşılaşıyoruz

şeklinde karşımıza hata çıkıyor 😊. Kodu çalıştırdığımızda ise

Parse error: syntax error, unexpected 'extends' (T_EXTENDS), expecting '{'

Şeklinde bize bir hata mesajı veriliyor. Bu hatada kod bize diyor ki: "Dostum bir class sadece bir classtan türetilebilir iki class tan türetilemez.". Şeklinde bize uyarı veriyor. Buna örnek vermek yani akılda kalıcı olarak tutmamızın bir yolu olarak "Bir elmanın genleri bir ağaca bağlıdır. Birden fazla ağacın geninden oluşmaz 😊" şeklinde aklınıza bir yapı kurabilirsiniz 😊. Şimmmdi bu kısma kadar anlamışsanız dostlarım işte bu kısımda bizim yardımımıza Trait koşuyor ve bize çok büyük yardımcı oluyor 😊. Gelin trait nasıl oluşturulur hemen o adıma geçelim

Trait Nasıl Oluşturulur

Ve geldik en güzel kısımlarımızdan birisine dostlarım 😊. Zihninizde çok zor veya karmaşık falan mı diye bir takıntı yapmayın dostlarım oluşturulması gayet basit 😊. Önce bundan bahsetmek istiyorum. Kod sayfamızı açalım ve

<?php

trait Cariler{

}

trait Stoklar{

}

şeklinde kısa bir kodla hızlıca Trait kısmımızı oluşturabiliyoruz 😊. Gördüğünüz gibi çok zor bir şey değil dostlarım hemen trait yazıp oluşturacağımız trait ismini girip sülü parantezleri açar açmaz hızlıca bize trait sunuyor 😊. Oluşturduğumuzda içerisine ekstra zorunlu bir parametre almıyor yani "Bu methodu koymazsan ben çalışmam 😊" şeklinde bir uyarı vermiyor.  Şimdi gelelim bu oluşturduğumuz trait konumuzun kullanımına 😊

Trait Nasıl Kullanılır

Dostlarım en zevkli kısımlardan birisine geldik diyebilirim 😊. Trait lerimizi oluşturduk artık ve sıra geldi bunları kullanmaya çünkü biz süs olsun diye trait oluşturmadık belli işlerimiz var ki bunları kullanacağız 😊. Hemen hızlıca bunları da inceleyelim dostlarım 😊. Oluşturduğumuz traitler bizim kullanacağımız class a extends ile bağlanmaz veya bir class gibi nesne oluşturulamaz 😊. Hemen bu kısmı da sizlere göstereyim

şeklinde biz oluşturduğumuz trait leri extend olarak bir class a tanımlayamayız 😊. Bir başka kural ise

şeklinde oluşturduğumuz trait üzerinden normal class üzerinde olduğu gibi bir nesne türetilmesi gerçekleşemez 😊. Oluşturduğumuz class içerisinde use olarak belirtmemiz gerek. Yani "Dostum bu traiti veya traitleri kullan" dememiz lazım 😊. Hemen gelin bunu da kodlama üzerinden anlatayım

<?php

trait Stoklar{
    public function urunstok(){
        echo "Ürün Stok Bilgileri Burada";
    }
}

trait Cariler{
    public function uruncari(){
        echo "Ürün Cari Bilgileri Burada";
    }
}

class Urunler{
    use Stoklar,Cariler;   // traitleri use komutu ile dahil ettik :)
}

şeklinde kodlarımızı yazdık dostlarım 😊. Bu kısımda bizim oluşturduğumuz Stoklar ve Cariler traitleri içerisindeki methodlarımızı çok rahat bir şekilde Urunler class ı içerisinde kullanabiliyoruz 😊. Bunu da örneklemem gerekirse biz use deyip 2 adet traiti bağladık ya yukarıda aslında şöyle bir olay oluyor bizim Urunler class ımız içerisinde

<?php

class Urunler{
    public function urunstok(){
        echo "Ürün Stok Bilgileri Burada";
    }

    public function uruncari(){
        echo "Ürün Cari Bilgileri Burada";
    }
}

şeklinde bir mantık oluşuyor 😊. Gördünüz değil mi hızlıca nasıl bir işlem yapıldı ve kullanıldı 😊. Normalde bunu birden fazla class oluşturup yapacağımızda extends bize durmadan durmadan hata çıkarıyordu ama trait bize dostça yaklaşıp işlerimizi halletmemizde yardımcı oldu 😊. Şimdi sizin aklınızda oluşan bir soru var ve ben şu an hissediyorum 😊

Hocam biz bu konuda yani trait kullandığımızdan sonra bu oluşturduğumuz class ı yine aynı şekilde nesne oluşturarak çağırabiliyoruz değil mi 😊. Yoksa harici olarak bir işlem yapmamıza gerek var mı şu an ?

Gayet güzel soru dostlarım cidden özellikle tam bu öğrenme süreci içerisinde bu denli güzel soruların gelmesi çok ama çok katkı sağlar insana 😊. Sorunuzun cevabına gelecek olursak dostlarım: "Hiçbir farklılık yok normal şekilde class ımızdan nesne alacağız ve bunu ekranımıza güzelce bastıracağız 😊". Hemen bunu da kodlama üzerinden göstereyim sizlere. Hemen kod kısmımızı açalım ve

<?php

trait Stoklar{
    public function urunstok(){
        return "Ürün Stok Bilgileri Burada";
    }
}

trait Cariler{
    public function uruncari(){
        return "Ürün Cari Bilgileri Burada";
    }
}

class Urunler{
   use Stoklar,Cariler;
}

$urun = new Urunler();
echo "Stok: ".$urun->urunstok()."<br>";
echo "Cari: </b>".$urun->uruncari();

şeklinde kodlarımızı yazalım 😊. En altta gördüğünüz gibi normal class tan nesne aldığımız gibi yolumuza devam ettik 😊. Şimdi ise browser sayfamızı açıp baktığımızda ise

Stok: Ürün Stok Bilgileri Burada
Cari: Ürün Cari Bilgileri Burada

şeklinde karşımıza çıktı veriliyor dostlarım ve buradan da kodlarımızın sorunsuz şekilde çalıştığını anlıyoruz 💯😊

Şimdi gelelim sizinle bir örnek yapalım 😊. Bu örneğimizde de edebiyat üzerinden gidelim 😊. Hemen kodlamamıza geçelim 😊

trait Dram{
    public function dramKitap($kitap_adi=null){
        return "Okuduğunuz Kitap: ".$kitap_adi;
    }
}

trait Polisiye{
    public function polisiyeKitap($kitap_adi=null){
        return "Okuduğunuz Kitap: ".$kitap_adi;
    }
}

class Kitap{
    use Dram,Polisiye;

    public function dramOku($kitap_adi=null){
        echo self::dramKitap($kitap_adi);
    }

    public function polisiyeOku($kitap_adi=null){
        echo self::polisiyeKitap($kitap_adi);
    }
}

$kitap = new Kitap();
echo $kitap->dramOku("Ahmet Günbay Yıldız - Sitem")."<br>";
$kitap->polisiyeOku("Mehmed Rauf - Define Kan Damlası: İki Polisiye Roman");

şeklinde kodlarımızı yazdık dostlarım 😊. Süreç burada nasıl işledi  diye soracak olursanız hemen size anlatayım

  1. Dram isminde bir trait oluşturduk ve içerisine dramKitap() isimli bir parametre koyduk. Buraya bir parametre ekledik ve bu method çalıştığında bize geri değer dönmesini istedik
  2. Polisiye isminde bir trait oluşturduk ve içerisinde polisiyeKitap() isimli  bir parametre koyduk. Aynı Dram isimli trait üzerindeki olduğu gibi bu method çalıştığında bize geri değer dönmesini istedik
  3. Kitap isimli bir class oluşturduk ve içerisine yukarı kısımda oluşturduğumuz trait leri use olarak dahil ettik
  4. Daha sonra Kitap isimli class ımızın içerisine dramOku() methodu oluşturduk ve bu method çalıştığı zaman içerisine gelen parametreyi dramKitap() isimli methoda göndermesi ve gelen sonucu echo ile ekrana basmasını söyledik
  5. Diğer bir adımda ise yine aynı şekilde Kitap isimli class ımızın polisiyeOku() methodu oluşturduk ve bu method çalıştığı zaman içerisine gelen parametreyi polisiyeKitap() isimli methoda göndermesi ve gelen sonucu echo ile ekrana basmasını söyledik
  6. En son kısımda Kitap isimli class üzerinden bir nesne oluşturduk ve dramOku() methoduyla polisiyeOku() methoduna bir parametre gönderdik (kitap isimleri yani 😊) ve bunların ekrana basılmasını sağladık

işte dostlarım bütün süreç bu şekilde gerçekleşti 😊. Kodlarımızı çalıştırdığımızda ise

Okuduğunuz Kitap: Ahmet Günbay Yıldız - Sitem
Okuduğunuz Kitap: Mehmed Rauf - Define Kan Damlası: İki Polisiye Roman

şeklinde bir çıktı bizi karşılayacaktır 😊. Buradan da kodlarımızın sorunsuz bir şekilde çalıştığının sonucuna ulaşıyoruz 💯😊

 

Eveeet dostlarım 😊. Bu yazımda sizlere bir OOP konusu olan trait lerin ne olduğundan, PHP üzerindeki oluşturulma ve kullanılma işlemlerinden, kullanım kurallarından bahsettim ve bunları örneklerle pekiştirmeye çalıştım. Umarım faydalı olmuşumdur 😊. Eksik veya hatalı bir anlatım yapmışsam benimle iletişime geçmekten çekinmeyin 😊. Konu başlarda biraz karmaşık veya zor gelebilir dostlarım anlıyorum 😊. Bu aşamada sizlerden istediğim her yazımın altında da dediğim gibi "İstikrarlı ve Azimli Olmalısınız, Bolca Pratik Yapmalısınız 😊". Bu dediklerimi hayat felsefeniz yaptığınız sürece başarı sizler için kaçınılmaz olacaktır 😊. Ayrıca yukarıdaki örnekteki kulllandığımız kitapları da okuyabilirsiniz 😊

Hayallerinizi gerçekleştirmeniz ve güzel yerlere gelmeniz dileklerimle... İyi çalışmalar dilerim 😊

Muhammed Fatih BAĞCIVAN
Yazar Hakkında

Kendi Halinde Bir Backend Developer

Önceki YazıJavascript Hoisting İşlemi
Sonraki YazıFront-End Developer Neleri Bilmeli
Yorumlar (0)
Bu Yazıya Ait Hiçbir Yorum Bulunamadı (veya admin onaylamadı). İlk Yorum Yapan Sen Ol
Yorum Yapabilirsiniz