PHP Traits Yapısı Oluşturmak ve Kullanımı

in #utopian-io7 years ago (edited)

Ne Öğreneceğim?

  • Trait Oluşturma
  • Sınıflarda Trait Kullanımı
  • Çoklu Trait

Gereksinimler

  • PHP 5.4 ve üzeri

Zorluk

  • Orta Düzey

Eğitim İçeriği

PHP dilinde nesneler baz alınarak yapılan programlamada ciddi gelişmeler yaşanmaya başladı. 1 Mart 2012 tarihinde piyasaya çıkan 5.4 versiyonundan bu yana kullanılan bir kavram olan Traits. Bu ifadenin Türkçe de ki karşılığı özellikler olarak ifade edilebilir.
C ve Java gibi dillerde extend deyimi ile birden fazla sınıftan katılım yoluyla miras alınarak yeni sınıflar ortaya çıkarılabilmektedir. PHP dili önceden katılma yoluyla birden fazla sınıftan miras alınmasına izin vermiyordu, daha doğrusu ifadeyle bunu karşılayamıyordu. Bu sorunun ortaya çıkmaması için 5.4 ile birlikte Trait yapısı oluşturuldu. Trait, aynı sınıflarda olduğu gibi tanımlanan ama kendi başlarına pek bir anlam ifade etmeyen yapılardır. Bu yapı ancak sınıflar ile birlikte kullanıldığında anlamlı olmaktadır.
unnamed.png
imagesource

Trait Oluşturma

Trait yapısının kullanım amacının bir sınıf genişletmek olduğunu, konunun başına ifade etmiştim. Yeni bir Trai oluştururken, bu yapının bir sınıfa miras bırakacağı göz önüne alınmalı ve bu düşünce ile oluşturulmalıdır. Trait yapıları yalnız başlarına örneklenemez, kullanılamaz. Mutlaka çalıştırılması için bir sınıf tarafından kullanılıyor olmalıdır.

Şimdi basit bir sınıf oluşturarak, bu sınıf ile aynı görevleri üstlenecek Trait yapısı oluşturalım.

<?php class OgrenciSinif { public $ad; public $soyad; public function konus () { echo $this->ad . ' ' . $this->soyad; } } ?>

Yukaıdaki sınıf örneğimizde iki adet özellik (ad ve soyad) tanımlanmış ve sınıfın sahip olduğu bir adet davranış (konus) bulunmaktadır. Buna göe, bu yapıyı ifade edecek Trait ise aşağıdaki gibi olmalıdır.

<?php trait OgrenciTrait { public $ad; public $soyad; public function konus () { echo $this->ad . ' ' . $this->soyad; } } ?>

Yukarıda ise Trait tanımlaması gerçekleştirilmiştir. Nasıl ki sınıf tanımlamasının başında class deyimi kullanılıyorsa, Trait tanımlaması yapılırken de trait deyimi ile başlanmalıdır. Oluşturulacak yapıda trait deyiminden hemen sonra Trait'in ismi yazılır. Daha sonra ise bildiğimiz sınıf tanımlamasının aynısı.

Sınıflarda Trait Kullanımı

Sürekli olarak Trait'lerin yalnız başına bir anlamı olmadığının ve bu yapının oluşturulmasındaki sebebin sınıflarda çoklu katılımı sağlamak olduğunu ifade ediyorum. Peki, Trait'leri sınıflarda nasıl kullanabiliriz?

<?php #Karakter seti tanımlaması header ('content-type:text/html;charset=utf-8') #Trait trait Kimlik { public $ad; public $soyad; public functrion konus () { echo $this->ad . ' ' . $this->soyad; } } #Sınıf class Ogrenci { use Kimlik; } #Ornekleme $o = new Ogrenci (); $o->ad = 'Sedat'; $o->soyad = 'Yildiz'; $o->konus(); #Sonuc: Sedat Yildiz ?>

Yukarıdaki örnekte Kimlik isminde Trait ve Ogrenci isminde bir Class oluşturduk. Eğer bir Trait ile sınıf geliştiriyorsak süslü parantezlerin içerisinde use deyimi ile hangi Trait kullanılarak genişletileceği belirtilmeli. Genişletme sonrası Ogrenci sınıfı, Kimlik yapısında var olan tüm özellik davranışlarına sahip olacaktır.

Çoklu Trait

İşte asıl konumuz burada başlıyor. Artık sınıflar tek bir noktadan miras almak zorunda değildir. Bu bölümde birden fazla Trait yapısı kullanarak tek bir sınıfa miras vereceğiz. Böylece PHP geliştiricilerinin sıkıntıya düştüğü çoklu katılım sorununu bir nebze çözmeye çalışacağız.

<?php header('content-type:text/html;charset=utf8'); #Trait trait Kimlik { public $ad; public $soyad; public function konus() { echo $this->ad . ' ' . $this->soyad . '; } } Trait Notlar { public $sozlu; public $yazili; public function notGor () { echo 'Sözlü sınav notu ' . $this->sozlu . '; echo 'Yazılı sınav notu ' . $this->yazili; } } #Sınıf class Ogrenci { use Kimlik, Notlar; } #Örnekleme $o = new Ogrenci (); $o->ad = 'Sedat'; $o->soyad = 'Yildiz'; $o->konus(); $o->sozlu = 80; $o->yazili = 90; $o->notGor(); ?>

Buradaki örnekte **Kimlik **ve Notlar isminde iki adet birbirinden farklı Trait tanımladık. Daha sonra ise bu iki Trait kullanılarak Ogrenci isminde yeni bir sınıf oluşturduk. Sınıf oluştrurken birden fazla Trait miras alacğaı için use deyiminden sonra misra alınacak Trait isimleri virgül ile birbirinden ayırdık. Artık Ogrenci isimli sınıfın ad, soyad, sozlu ve yazili olmak üzere 4 adet özelliği, konus() ve notGor() isimli 2 adet davranışı olmuş oldu.

Katkılarından dolayı Sercan Çakır'a teşekkürler.



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Hocam emeğinize sağlık :)

Teşekkür ederim :)

An excellent and useful article.

Thank you very much!

çok güzel bir çalışma benimde ilgimi çekti umarım emeğinizin karşılığıda gelir utopıandan bende çevirilere başlayacağım fransızca olarak umarım işler yolunda gider başarılarınızın devamını dilerim

Teşekkür ederim, hayırlısı olsun sizin için de.

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Thank you so much.

Hey @sedatyildiz I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x