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.
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.
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.
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?
#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.
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
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
Suggestions
Get Noticed!
Community-Driven Witness!
I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!
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