Trait nedir? Nasıl Kullanılır?

Standard

PHP 5.4 ile hayatımıza giren yeniliklerden biriside trait.. Peki bu Trait nedir?
Trait için dilimizde karşılık olarak özellik diyebiliriz. Trait ler bizim multi inheritance yani çoklu kalıtım yapmamızı sağlar.. Bildiğiniz gibi sınıflar bu şekilde birden fazla kalıtıma imkan vermiyordu ama trait ile artık bu işlemi yapabiliyoruz ve tanımladığımız sınıflara “trait”ler ile yeni özellikler, metodlar ekleyebiliyoruz.. Bir sınıfta, istediğimiz kadar “trait” kullanabiliyoruz.
Yavaştan örneklere girişelim ve pekiştirelim isterseniz..

<?php
trait birinciOzellik {
    public function adOku() {
        echo "Onur";
    }
}

trait ikinciOzellik {
    public function soyadOku() {
        echo "Canalp";
    }
}

trait ucuncuOzellik {
    public function sehirOku() {
        echo "Ankara";
    }
}

class OrnekSinif {
    use birinciOzellik, ikinciOzellik, ucuncuOzellik;
}

$ornek = new OrnekSinif;
$ornek->adOku();
$ornek->soyadOku();
$ornek->sehirOku();
?>

Gördüğünüz gibi OrnekSinif önceden tanımladığımız 3 traiti de kullandı ve bunların özelliklerine sahip oldu..  İşin özü,  trait’ler bir nevi sınıflara benzer fakat türetilemez. Sadece özellik olarak sınıfların içerisinde use anahtarı ile tanımlanıp kullanılırlar.

Şimdi ise iç içe trait ve Self kullanımına bir örnek vermek istiyorum;

<?php
trait ilce{
	public function ilceOku(){
		echo "Çankaya";
	}
}

trait il{
	use ilce;
	public function adresOku(){
		echo "Ankara";
		self::ilceOku();
	}
}

class AdresSinifi{
	use il;
}

$adresim = new AdresSinifi;
$adresim->adresOku();
?>

Baktığınız zaman gayet açık..
Şimdi birde Trait ve Parent kullanımına bakalım;

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld;
$o->sayHello();
?>

Şimdi ise insteadof ile tercihlerimizi yönlendireceğiz ve as kullanımına bakacağız. insteadof ile aynı isimde metod barındıran iki trait içinden hangisindekini kullanmak istediğimizi ele alacağız ve as ile metodu başka isimle çağırmaya bakacağız..

<?php

trait Anadolu{
    function sehirOku(){
        echo "Ankara";
    }
}
trait Ege{
    function sehirOku(){
        echo "İzmir";
    }
}
class Memleket{
    use Anadolu, Ege{
        Anadolu::sehirOku insteadof Ege; //Anadolu trait içindeki sehirOku metodunu Ege ye tercih ettik..
        Ege::sehirOku as Yeni; //artık Ege trait altındaki sehirOku metodu bizim için Yeni şeklinde çağırılacak
    }
}

$ikamet = new Memleket;
$ikamet->sehirOku(); //Çıktı: Ankara
$ikamet->Yeni(); //Çıktı: İzmir

//Sonuç: Ankara İzmir
?>

Son olarak trait ler için public , private , protected özellikleri tanımlayabileceğinizi ve değişkenleri de trait ile okutabileceğinizi belirterek makalemi sonlandırmak isterim.
Daha detaylı bilgiye ulaşmak isteyenler için: http://www.php.net/manual/en/language.oop5.traits.php
Herkese iyi çalışmalar dilerim..

3 thoughts on “Trait nedir? Nasıl Kullanılır?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir