11 Ekim 2009Php ile class özellikleri
Bir önceki yazımızda sınıflarımızda kullanabileceğimiz public, protected, private, static, const ve final gibi özelliklerin geldiğine değinmiştik. Bu özellikler sınıf içerisindeki bir değişken veya metodun kullanıcı tarafından kullanılıp kullanılmayacağına karar vermek veya türetilen bir sınıfın bunu kullanıp kullanamacağını karar vermek için kullanıyoruz. Yani kısaca özetlemek gerekirse bir kısıtlama söz konusu yapabilmekteyiz. Bu özellik php4 ile yapılamamktaydı bu da yazılımcılara büyük bir sıkıntı idi.
Zira hangi metot veya değişkenlerin public veya private olduğunu belirtmek zorunda kalırdık. Php5 ile artık bu özelliklere hakimiz.
Public Özelliği
Öncelikle public özelliğine değinelim. Public özelliği atanan bir değişken veya metot kullanıcı tarafından erişilebilir olmaktadır. Aynı zamanda sınıf içerisinden veya türeyen bir sınıf içersinden de erişebilir.
Hemen bir örnekle daha da pekiştirelim.
< ?php class a { public $isim = 'yusuf'; public function isimGetir() { echo $this->isim; } } $a = new a; echo $a->isim; echo '<br />'; $a->isimGetir(); ?>
Yukarıdaki örnekte hem bir değişkene public özelliğini hem de bir metoda public özelliğini atadık. Public ve diğer özellikler değişken veya metotdan önce başına yazılır örnektede görüldüğü gibi.
$a ve isimGetir() e public özelliği atandığı için sınıf başlatarak a classındaki bu değerlere erişme hakkına sahip olduk.
Protected Özelliği
Protected özelliği atanan bir değişken veya metot ise sadece sınıf içerisinden veya türetilen bir sınıf içerisinden erişim hakkına izin verir. Yani kullanıcı başlattığı sınıf içindeki protected tanımlı değişken veya metotlara asla erişemez.
Örnekle devam edelim.
< ?php class a { protected $isim = 'yusuf'; public function isimGetir() { echo $this->isim; } } $a = new a; echo $a->isim; echo '<br />'; $a->isimGetir(); ?>
Yukarıdaki örneği çalıştırdığımızda ekrana “Cannot access protected property..” diye hata çıktısı verecektir. Bunun sebebi classı başlatıp ardından da protected özelliği atanmiş değişkeni çağırmak istememizden dolayıdır. Ancak echo $a->isim; satırını silersek ekrana bu sefer $isim içeriğini yazacaktır.
Neden hata vermiyor gibi bir düşünce gelebilir aklınıza ama ne demiştik protected veya private tanımlı bir değişken veya metot sadece sınıfın kendi içinden çağrılabilir dolayısıyla public tanımlanmış isimGetir() metodu sınıfın içinde olduğu için $isim değişkenine bu metot sayesinde erişmiş oluyoruz. Böylece classı kullanacakların classı olumsuz etkilemesinden korumuş oluyoruz.
Private Özelliği
Private özelliği de işleyiş olarak protected a benzese de aslında protected tek farkı türetilen bir classdan erişim hakkı yapamaz. Bu da demek oluyor ki private özelliği atanan değişken veya metot sadece o sınıf için özel olmuş oluyor. Hiç bir şekilde classı kullanmak isteyen ziyaretçi veya türeyen bir sınıf bu değişken veya metota erişim yapamaz.
Örnekle devam edelim
< ?php class a { private $isim = 'yusuf'; public function isimGetir() { echo $this->isim; } } $a = new a; echo $a->isim; echo '<br />'; $a->isimGetir(); ?>
Yukarıdaki örnekte bu sefer $isim değişkenine private özelliğini atadık. Sınıf başlatılıp ardından $isim değişkenini çağırdığımızda ekranda “Cannot access private property..” gibi bir hata ile karşılaşarız. Çünkü $isim değişkeni sadece o sınıf için özel bir değişken. Hiç bir şekilde dışarıdan ( kullanıcı tarafından ) veya türetilen sınıftan erişim sağlanamaz.
Böylelikle türetilen classların da buna etki edebilerek mevcut classın işleyişinin bozulması önlenmiş olur.
Static özelliği
Static özelliği atanmış bir değişken veya metot ramde saklanır. Böylece sürekli sürekli çağrılarak ramden çalmak yerine bir defaya mahsus rame atılarak performans kaybı önlenmiş olur. Static özelliğini herşeye atamakta doğru değildir. Zira projede kullanılacak sabit değişken veya metota atamak doğrudur. Çünkü bunlar hep aynı sonucu döndürecekleri için bir defaya rame aktarılması bize performans açısından büyük hız getirecektir.
Ayrıca static özelliği atanmış bir değişken veya metoda sınıf içerisinde $this yerine self:: ile erişim sağlanmaktadır.
Örnekle devam edelim.
< ?php class a { private static $isim = 'yusuf'; public static function isimGetir() { echo self::$isim; } } a::isimGetir(); ?>
Bu örnekte de isimGetir metoduna hem public ( dışarıdan erişim yapma özelliği ) hem de static özelliği atanmıştır. Burda tek fark olarak normalde sınıfı başlatmamız gerekirdi ancak isimGetir metodu static olduğu için direk olarak erişim yapabiliriz. Buna değişkenlerde dahil.
Dışarıdan erişim yaparken sınıfadi::metot veya değişken şeklinde erişim yapabiliriz. a::isimGetir() diyerek a classının isimGetir() metoduna direk erişim yaptık ve static metodumuzu çağırdık böylece artık rame atıldı veya bundan sonraki her çağrılmasında artık bize ramden dönerek performans artışı sağlamış olacaktır.
Const Özelliği
Const özelliği atanan bir değer class içinde sabit özelliğini alır. Bu bizim normal kodlarımızdaki define() metodu ile aynıdır fakat sadece class içinde geçerlidir. Const özelliği atanmış bir sabite $this ile değil yine self:: ile erişim yapmaktayız dolayısıyla static özelliğini alırlar çünkü sınıf boyunca sakladıkları değer aynı kalacağından bir defaya mahsus ram de tutulurlar.
Ayrıca const özelliği atanan sabitin başında $ işareti bulanamaz. const sabit = ‘deger’; şeklinde tanımlanırlar.
Örnekle devam edelim.
< ?php class a { const isim = 'yusuf'; public function isimGetir() { echo self::isim; } } $a = new a; echo a::isim; echo '<br>'; $a->isimGetir(); ?>
Bu örnekte de görüldüğü gibi isim sabiti static özelliği de olduğu için hem a::isim; şeklinde ulaşabildik hem de sınıf içinde bir metot sayesinde ulaşabildik.
Final Özelliği
Final özelliği atanmış bir metot veya sınıf son metot veya son sınıf olduğunu işaret eder yani kendisinden sonra herhangi bir başka metot veya sınıf gelemez anlamını taşımaktadır.
Örnekle devam edelim
< ?php class a { private $isim = 'yusuf'; public final function isimGetir() { echo $this->isim; } } class b extends a { private $baska_isim = 'veli'; public function isimGetir() { echo $this->baska_isim; } } $b = new b; $b->isimGetir(); ?>
Bu örnekte a classının en son metodunun isimGetir() olduğu tanımlanmıştır ve bu metotdan sonra herhangi bir metot gelemeyecektir. Yani a sınıfından türeyen bir class da hiç bir şekilde isimGetir() metodu bulunamaz çünkü isimGetir() a sınıfının final metodur ve override (yok sayılarak yeniden aynı metot yazılamaz. (tamam tercümem biraz düşük oldu
) edilemez.
Bu örnek bize metot içindi birde sınıflar bir birleri arasında türetilirken artık son sınıf olduğunu belirtmemiz gerekebilir. Bunun için de class sözcüğünün başına final anahtarı getirilir.
< ?php class a { public function aGetir() { echo 'Ben A sınıfıyım. '; } } class b extends a { public function bGetir() { echo 'Ben B sınıfıyım. '; } } final class c extends b { public function cGetir() { echo 'Ben C sınıfıyım ve benden sonra başka bir sınıf bana extends edilemez. '; } } $c = new c; $c->aGetir(); $c->bGetir(); $c->cGetir(); class d extends c { public function dGetir() { echo 'Ben D sınıfıyım.'; } } $d = new d; ?>
Bu örnek çalıştırıldığında c classı final anahtar sözcüğü atandığı için kendisinden hiç bir şekilde sınıf türetilemeyecek ve ekrana “Class d my not inherit from final class (c)..” gibi şeklinde hata mesajı döndürecektir.
Artık yazımızın sonuna geldik bir class yazmak için temel bilgileri vermeye çalıştım. Soru ve önerileriniz için yorumları kullanabilirsiniz.


Yine detaylı ve açıklayıcı bir yazı olmuş. Ellerine sağlık Yusuf Koç.. devamını bekliyorum
Ellerine sağlık işime yaradı
Çok yararlı oldu.En anlaşılır sen anlatmışsın konuyu.
arkadaşım gerçekten çok büyük bir ihtiyacı gideriyorsun eline sağlık yeni çalışmalarını merakla bekliyorum..
Bayılıyorum yazılarına Yusuf
harikasın.
Merhabalar, öncelikle yazın güzel başarılarının devamını dilerim.
Yalnız bir sorum olacak;
static class özelliğinin mantığını anladım. Ama nerelerde kullanmam gerektiğini anlayamadım. Sabit derken ne kastediliyor. İçinde sql sorguları yapılamaz mı. Sitenin temasını cagırırken kullanılır mı? Ama temanın icinde sqlden gelen değişkenlerde olabilir. Umarım sorumu anlamışsunızdır tşkler..
@Mustafa
örneğin bir fonksiyon hep aynı sonucu döndürüyorsa buna static özelliğini atayabilirsiniz ya da bir değişken aynı sonucu döndürüyorsa static özelliği atayabilirsiniz. Bunlar ram de depolanır ve ramden çağrılır. Sürekli içeriği değişen fonksiyon veya değişkene static özelliğini atamanız pek bir şey ifade etmez.
Aslında burda yazdıklarını anladım. ben sana soruyu şöyle sorayım; static özelliğini hangi durumda hangi methodlarda kullanıyorsun?
@Mustafa
yukarıda saydığım gibi yerlerde kullanıyoruz bir de singleton design pattern kullanırken yani bir sınıf bir kere çağrılmak isteniyorsa o zaman sınıfı ram de tutup varsa ramden çağırıyoruz.
http://www.ysfkc.com/php/signleton-desing-pattern-oop-yazilim-deseni.html
Teşekkür ederim dostum cok sagol. Bir sorum daha olacak. Bu konuyla alakasız ama Try catch hata ayıklama bloğunu hangi durumlarda kullanmalıyım. Nasıl kullanıldığını az cokda mantığını biliyorum. Ama nerde ne şekilde kullanmam gerekli. Nasıl bir fayda sağlıyor. İnceledim classlarda pek kullananıda göremedim. Kullanmalıyım. Evet ise nerelerde kullanmalıyım.? Bu sorumu özeldende cevaplyabilirsin. Bu başlıkla alakasız cünkü.
@Mustafa
buna şuralarda demek yanlış olur. Hata mesajlarını daha detaylı hale getirmek daha yönetilebilir hale getirmek için kullanabilirsin. Yani kullanım alanı kişiye göre değişir. Ama kısaca hata yakalamak için kullanılır kısaca..
public, protected ve private olaylarını anlatırken class içindeki değişkenleri “isim” olarak tanımlamışsın ama isimgetir() metodunda “a” olarak çağırmışsın.
bir de final olarak tanımlanmış metodun üzerine aynısını tanımlamaya kalkarsak alacağımız fatal error’u da yazına eklersen çok iyi olur.
gerçekten güzel bir yazı olmuş. eline sağlık.
@garme
bildirim için teşekkür ederim. Akşam düzelteceğim.
verdiğin tüm komutlar syntax hataları var ama mantık doğruda olsa onada eyvalah derdik ama malesef mantıknta hatalı ve eksik lüntfen yazdığımız kodları deneyip insanlara analatalım yoksa hiç kimseye bir yarar saglamaz değilmi????
Raiden Alıntı;
@Mustafa
örneğin bir fonksiyon hep aynı sonucu döndürüyorsa buna static özelliğini atayabilirsiniz ya da bir değişken aynı sonucu döndürüyorsa static özelliği atayabilirsiniz. Bunlar ram de depolanır ve ramden çağrılır. Sürekli içeriği değişen fonksiyon veya değişkene static özelliğini atamanız pek bir şey ifade etmez.
____
Yusuf abi,
örneğin class içinde bir metodumuz olsun bu metot verdiğimiz parametreyi belirtiğimiz yerlerden parçalara bölsün. buda her dönen sonucun aynı olmayacağının işaretidir. Böyle bir metot static olarak tanımlanır mı ?
Yanlızca dönen sonuclar bool olan metotlara static tanımlamak mı daha avantajlı ? Bu static konusu ben bir türlü anlayamadım.
self ile $this arasındaki farkı öğrenmek için googledan bir arama yaptım ve bu siteyi buldum. ve yusuf arkadaşımız saolsun güzel anlatmış. teşekkürler…
Merhaba inanırmısınız sitenize dmozdan geldim
ve ilk dikkatimi ceken şey sitenin hızı oldu. sanırım netdirekt ile çalışacağım
Merhaba,
Yazılarınız gerçekten yararlı yanlız, sizden asıl ricam özellikle sınıf anlatımlarınızı arttırmanız. Çünkü Türkçe kaynak çok az miktarda ve anlaşılır değil. Eğer Türk Coder’lara bu desteği sunarsanız gelişim büyük ölçüde olası…
Güzel yazınız ve bloğunuz için teşekkürler, iyi çalışmalar.
güzel bi anlatım
Bu konuyu bir türlü çözememiştim, güzel oldu, tşkler.
anlatımınız güzel,tşk ederim.
bu classların C deki classlardan hiç bir farkı yok mantık olarak öyle değil mi ?