Php de Nesne Yönelimli Programlama - Erişim belirteçleri

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.

ETİKETLER
php de erişim belirteçlerierişim belirteçleriphp access modifiersphp public private protected kullanımıphp publicphp privatephp protectedüst sınıfın elemanlarına erişim
Öncekİ Yazı

Php de Nesne Yönelimli Programlama - Sınıf yapısı ve kullanımı

Sonrakİ Yazı

Php de Nesne Yönelimli Programlama - Kurucu ve yıkıcı metotlar

İlgili Yazılar