Aylık Arşiv: Aralık 2011

PHP 5.4 ile Gelen Trait ve Özellikleri

Merhaba, önümüzdeki aylarda PHP 5.4’ün çıkması bekleniyor. 5.4 ile Trait özelliği de PHP’yi eklenmiş olacak. Peki nedir bu Trait?

Trait kelime anlamı olarak Özellik anlamına gelir. Trait için en kısa olarak multi inheritance diyebiliriz. Trait ile bir kodu birden fazla class’ta, trait’te kullanabilirsiniz. Örnekleri incelerseniz biraz daha anlaşılır olacağını düşünüyorum.

Not: Bu makale OOP mimarisi hakkında bilgi sahibi olan kişiler içindir.

İlk trait örneğimizi yapalım:

<?php
trait bir{
 	function isim(){
 		echo "Merhaba, benim adım Adil.";
 		}
 	}
trait iki{
	function bilgi(){
		echo "Bloguma hoşgeldiniz!";
		}
	}
class Ornek{
	use bir, iki;
	}
$test = new Ornek;
$test->isim();
$test->bilgi();
?>

Farkettiğiniz üzere trait’te isim() ve bilgi() fonksiyonlarını oluşturduktan sonra, bir class ile oluşturulan trait’leri, use operatörüyle kullandık.

İç içe trait kullanabilirsiniz:

<?php
trait isim{
 	function adim(){
 		echo "Adil "; 
 		}
 	}
trait soyad{
	use isim;
	function soyadim(){
		echo "İlhan";
		}
	}
class Bilgi{
	use soyad;
	}
$test = new Bilgi;
$test->adim();
$test->soyadim();

?>

Trait’lerde self, parent kullanabilirsiniz:

Self

<?php
trait kitap{
	function yazar(){
		echo "Yazar bilgisi burada.";
		}
	}
trait konu{
	use kitap;
	function konusu(){
		self::yazar();
		echo "Kitabın konusu burada.";
		}
	}
class Bilgiler{
	use konu; //sadece konu kullanıldı. kitap, konu'nun içinde kullanılmıştı.
	}
$test = new Bilgiler;
$test->konusu();
?>

Parent

<?php
class Bilgisayar{
	function Marka(){
		echo "Toshiba ";
		}
	}
trait Ozellik{
	function Seri(){
		parent::marka();
		echo "L Serisi";
		}
	}

class Sonuc extends Bilgisayar{
		use Ozellik;
	}

$bilgi = new Sonuc;
$bilgi->Seri();
?>

insteadof operatorununu kullanımı

Bir den fazla Triat’ınız var diyelim. İkisinde de aynı isimde fonksiyonlar var diyelim. insteadof operatoru ile bunların birisini kullanabilirsiniz.

Burada dikkat etmeniz gereken önemli bir konu var. Önceki örneklerde use bir, iki. şeklinde kullanıyorduk. Ama insteadof kullanacaksanız use bir, iki {} yapmalısınız.

<?php
trait Araba{
	function Marka(){
		echo "Mercedes";
	}
}
trait Otomobil{
	function Marka(){
		echo "Fiat";
	}
}
class Arac{
	use Araba, Otomobil{
		Araba::Marka insteadof Otomobil;
	}
}
$bilgi = new Arac;
$bilgi->Marka();
?>

Aynı isimde fonksiyona sahip iki Trait’den birisini kullandıktan sonra, as ile fonksiyon ismi değiştirilebilir.

<?php
trait Araba{
function Marka(){
	echo "Mercedes";
	}
}
trait Otomobil{
	function Marka(){
		echo "Fiat";
	}
}
class Arac{
	use Araba, Otomobil{
		Araba::Marka insteadof Otomobil;
		Otomobil::Marka as Yeni;
	}
}
$bilgi = new Arac;
$bilgi->Marka();
$bilgi->Yeni();
?>

Trait’deki bir değişkene de erişebilirsiniz:

<?php
trait Bilgi{
	public $site = "Blog";
}
class Info{
	use Bilgi;
}
$test = new Info;
echo $test->site;
?>

Trait’de Visibility bilgisini ayarlayabilirsiniz.

<?php
trait Araba{
	private function Marka(){
		echo "BMW";
	}
	protected function Model(){
		echo "M3";
	}
}
class Bilgi{
	use Araba;
	function Galeri(){
		self::Marka();
	}
}
$obj = new Bilgi;
$obj->Galeri();
?>

Yine private, protected, public’in özellikleri trait’de geçerlidir.

<?php
trait Araba{
    private function Marka(){
        echo "BMW";
    }
 
    private function Model(){
        echo "M3";
    }
}
class Bilgi{
    use Araba;
    function Galeri(){
        self::Marka();
    }
}
class Test extends Bilgi{
    function Info(){
        parent::Model();/* Hata verecek. Bilgi'de Araba'yı kullanmamıza rağmen burada Model()'i private olduğu için
	doğal olarak görmedi.*/
    }
}
$obj = new Bilgi;
$obj->Galeri();
$yeni = new Test;
$yeni->Info();
?>

extends, ettiğimiz class’ta Model()’e nasıl ulaşırız:

<?php
trait Araba{
	private function Marka(){
		echo "BMW ";
	}
	private function Model(){
		echo "M3";
	}
}
class Bilgi{
	use Araba;
	function Galeri(){
		self::Marka();
	}
}
class Test extends Bilgi{
	use Araba{
		Model as public YeniModel;/*Model() fonksiyonu public visibility de YeniModel fonksiyonu oldu.
Eğer bir fonksiyonun visibility ayarını değiştirecekseniz, yeni isim vermelisiniz.*/
	}
}
$obj = new Bilgi;
$obj->Galeri();
$yeni = new Test;
$yeni->YeniModel();
?>

Böyle bir kullanım genelde olmaz. Ama örnek olduğu için, extends edilen class’ta nasıl visibility değiştirebileceğinizi göstermek istedim.

Eğer bilgisayarınızda PHP 5.4 yüklü değilse codepad.viper-7.com adresindne PHP Version’dan 5.4’ü seçip denemeler yapabilirsiniz.

 
66 Kudos
Don't move