Php de class(sınıf) içinde tanımlanan özellik ve metotlara nerelerden erişilebileceğini belirlediğimiz yapılara erişim belirteçleri deriz. Bir sınıf yazıldığı zaman sınıfın üyelerine her yerden doğrudan ulaşılabilmesi programcılık açısından doğru olmaz. Bu yüzden bazı verilerin erişimini kısıtlamak veya genelleştirmek istediğimizde erişim belirteçlerini kullanırız. Php de erişim belirteçleri public, private ve protected olmak üzere 3 farklı şekilde tanımlanmıştır.
- public: public olarak tanımlanan özelllik ve metotlara tanımlandığı sınıf içinden, bu sınıftan üretilen nesnelerden ve bu sınıftan miras alan (extends) alt sınıflardan erişilebilir. Kısaca bu tanımlamada herhangi bir kısıt yoktur. Her yerden erişilebilir. Ayrıca erişim belirteci belirtilmezse bu varsayılan olarak public değerini alır.
- private: private olarak tanımlanan özellik ve metotlara sadece tanımlandığı sınıf içerisinden erişilebilir.
- protected: protected olarak tanımlanan özellik ve metotlara tanımlandığı sınıf içinden ve bu sınıftan miras alan (extends) alt sınıflar içinden erişilebilir. Nesneler üzerinden erişilemez.
Aşağıda gösterilen özet tabloyu inceleyebilirsiniz.
ÖRNEK UYGULAMALAR
<?php
class Uye
{
public $ad = 'Ahmet';
private $soyad = 'Ardahanlı';
protected $meslek = 'Bilgisayar Mühendisi';
public function adYazdir()
{
echo $this->ad . '<br>';
}
private function soyadYazdir()
{
echo $this->soyad . '<br>';
}
protected function meslekYazdir()
{
echo $this->meslek . '<br>';
}
}
$uye1 = new Uye();
echo $uye1->ad;
echo $uye1->soyad; // erişim hatası
echo $uye1->meslek; // erişim hatası
$uye1->adYazdir();
$uye1->soyadYazdir(); // erişim hatası
$uye1->meslekYazdir(); // erişim hatası
?>
Örnekte $uye1
nesnesi üzerinden 3 özellik ve metoda erişmek istedik. Ancak sadece public
olarak tanımlanan $ad
özelliğine ve adYazdir()
metotlarına erişebildik. Private ve protected olarak tanımlanan diğer elemanlara erişim yapmak istersek sistem ölümcül hata(fatal error) verecektir.
Private ve protected elemanlara nesne üzerinden erişmek istersek, sınıf içinde public tanımlı bir metot kullanırız. Örneğin;
<?php
class Uye
{
public $ad = 'Ahmet';
private $soyad = 'Ardahanlı';
protected $meslek = 'Bilgisayar Mühendisi';
public function bilgileriYazdir()
{
echo $this->ad . '<br>';
echo $this->soyad . '<br>';
echo $this->meslek . '<br>';
}
}
$uye1 = new Uye();
$uye1->bilgileriYazdir();
/* SONUÇ:
Ahmet
Ardahanlı
Bilgisayar Mühendisi
*/
?>
Gördüğünüz gibi public tanımlı bilgileriYazdir()
metoduna, $uye1
nesnesi üzerinden erişip public, private ve protected olarak tanımlı tüm özelliklerin değerlerini elde edebildik.
Alt sınıflar, üst sınıfın public ve protected elemanlarını miras olarak alabilirler. Yani alt sınıf içinden üst sınıfın public ve protected elemanlarına erişebiliriz. Fakat bu alt sınıftan türetilen nesneler üst sınıfın hiçbir elemanına erişemez. Örneğin;
<?php
class UstSinif
{
public $publicOzellik = 'bu üst sınıf public özelliğidir';
private $privateOzellik = 'bu üst sınıf private özelliğidir';
protected $protectedOzellik = 'bu üst sınıf protected özelliğidir';
}
class AltSinif extends UstSinif
{
public $publicOzellik2 = 'bu alt sınıf public özelliğidir';
private $privateOzellik2 = 'bu alt sınıf private özelliğidir';
protected $protectedOzellik2 = 'bu alt sınıf protected özelliğidir';
public function yazdir()
{
echo $this->publicOzellik . '<br>';
echo $this->protectedOzellik . '<br>';
echo $this->publicOzellik2 . '<br>';
echo $this->privateOzellik2 . '<br>';
echo $this->protectedOzellik2 . '<br>';
// echo $this->privateOzellik; // Undefined property hatası
}
}
$alt1 = new AltSinif();
$alt1->yazdir();
echo $alt1->publicOzellik . '<br>';
echo $alt1->publicOzellik2 . '<br>';
/*
echo $alt1->privateOzellik; // Undefined property hatası
echo $alt1->privateOzellik2; // Fatal error: Cannot access private property
echo $alt1->protectedOzellik; // Fatal error: Cannot access protected property
echo $alt1->protectedOzellik2; // Fatal error: Cannot access protected property
*/
/* SONUÇ:
bu üst sınıf public özelliğidir
bu üst sınıf protected özelliğidir
bu alt sınıf public özelliğidir
bu alt sınıf private özelliğidir
bu alt sınıf protected özelliğidir
bu üst sınıf public özelliğidir
bu alt sınıf public özelliğidir
*/
?>
Örnekte $alt1
nesnesi ile AltSinif
içinde tanımlanan yazdir()
metodu çağrılıyor. Bu metot içinde de hem kendi sınıfının bütün elemanlarına hem de UstSinif
ın public ve protected olarak tanımlanan değerlerine erişip görüldüğü gibi ekranda yazdırabiliyoruz. Burada echo $this->privateOzellik;
şeklinde UstSinif
ın private elemanına doğrudan ulaşmak istersek sistem bize Undefined property (tanımsız özellik) hatası verecektir. Dikkat ederseniz en alt satırlarda $alt1
nesnesi üzerinden hem AltSinif
ın hem de UstSinif
ın public değerlerine erişebildik. Fakat private ve protected elemenlara nesne üzerinden erişemiyoruz.