Php Oop Dersleri 2 – Gizlilik

Merhaba Arkadaşlar,

Bir önceki oop dersleri yazımızda oop nedir ne değildir sınıf nasıl oluşturulur gibi konulara açıklık getirmiştik. Bu yazımızda ise oop mimarisinde olmazsa olmaz nitelikte olan gizlilik konusunu ele alacağız. Oop mimarisinde gizlilik: sınıf içerisinde kullanılan sabit değişkenlerin ve metotların nerelerden erişilebileceğinin belirlenmesidir. Bir diğer deyişle sınıf içerisinde kullanılan tüm argümanların güvenliğinin belirlenmesidir. Bir proje üzerinde birden çok yazılımcı çalıştığında, yazılımcıya erişebileceği ve erişemeyeceği sabit değişkenler ve metotlar tanımlayarak yanlış kullanımların önüne geçmiş oluruz.

Oop mimarisinde PHP’nin bize sunmuş olduğu 5 adet gizlilik komutu bulunmaktadır. Bu komutlarımız public, private, protected, static, ve final komutlarıdır.

Public

Public komutuyla oluşturulan tüm sabit değişken ve metotlara her ortamdan erişilebilir. Kısa bir örnekle konuyu özümseyelim.


class OopDersleri {

   public function __construct() {

   }

   public function merhaba() {

      echo "Merhaba";

   }

}

$oop = New OopDersleri();
$oop->merhaba();

Bir önceki dersimize hatırlatma olması amacıyla ne yaptığımıza bir bakalım. Class komutuyla yeni bir sınıf oluşturduk. public function komutuyla erişilebilir bir metot tanımladık. $oop değişkenine New komutuyla tanımladığımız sınıfı atadık. Ve son olarak da $oop->merhaba() koduyla da sınıfımız içinde ki merhaba adlı metotu çalıştırdık.

Bu arada sınıf içerisinden yada sınıf dışından erişilebilme de nedir diye soracak olursanız hemen ona da bir açıklık getirelim. Yukarıdaki örneğimiz sınıf dışından erişime örnektir. Şöyle ki biz önce sınıfımızı yazdık daha sonra sınıf parantezini kapattıktan sonra ( { } )  $oop adında bir değişken oluşturup new komutuyla sınıfı başlattık. Daha sonra da $oop->merhaba(); koduyla da sınıfın merhaba metoduna eriştik. Eğer ki merhaba metoduna sınıf içinden erişmeye çalışmıs olsaydık kodlarımız şu şekilde olmalıydı.


class OopDersleri {

   public function __construct(){

      $this->merhaba();

   }

   public function merhaba() {

      echo "Merhaba";

   }

}

$oop = New OopDersleri();

Burada dikkatinizi çektiği üzere $this adında bir komut kullandık. Sınıf içerisindeki public olarak tanımlanan bir metot veya sabit değişkene $this komutuyla erişebiliriz. Şimdide public bir argüman tanımlayalım ve public olayımızı burada bitirelim.


class OopDersleri {

   public $merhaba = "Merhaba";

   public function __construct(){

      echo $this->merhaba;

   }

}

$oop = New OopDersleri();

Tekrar ne yaptığımıza bir bakalım 🙂 OopDersleri adında bir sınıf oluşturduk. public $merhaba = “Merhaba”; ile public bir argüman oluşturduk ve __construct ana metodumuzda oluşturduğumuz argümanı ekrana bastık. Burada dikkat etmemiz gereken olay $this-> komutuyla sınıf içerisindeki bir argümana erişmek istersek argüman adından sonra () kullanmıyoruz. Ancak bir metoda erişmek istersek () parantez kullanmalıyız.

Private

Yalnızca sınıf içerisinden erişilebilen metot veya argüman oluşturmak istediğimiz zaman private komutunu kullanırız. Private olarak tanımladığımız bir metot veya argümana sınıf dışından yada türetilen bir sınıf dışından erişmemiz mümkün değildir. Türetilen sınıf da nerden çıktı 😀 diyecek olursanız birazdan açıklayacağım. Tekrar konumuza dönecek olursak yukarıda örneğimizdeki merhaba metodunu private olarak tanımlayarak konumuzu özümseyelim.


class OopDersleri {

   public function __construct(){

   }

   private function merhaba(){

      echo "Merhaba";

   }

}

$oop = New OopDersleri();
$oop->merhaba();

Bu kodumuzu çalıştırdığımızda fatal error (ölümcül hata) döndürecektir. Çünkü biz private olarak tanımladığımız bir metoda sınıf dışından ( $oop->merhaba() ) erişmeye çalıştık. Private olarak tanımlanan bir metot veya argümana sınıf içerisinden erişmek istediğimiz zaman yukarıda yeni öğrenmiş olduğumuz $this komutuyla yada self::metotadı şeklinde erişebiliriz. Yukarıdaki kodumuzun çalışan halini yazarak private olayımızı da halledelim.


class OopDersleri {

   public function __construct(){
      self::merhaba();
   }

   private function merhaba(){

      echo "Merhaba";

   }

}

$oop = New OopDersleri();

Protected

Protected komutuyla oluşturulan metot ve argümanlara yalnızca sınıf içerisinden ve türetilen sınıf içerisinden erişilebilir. Protected olarak tanımlanan bir metot veya argümana sınıf dışından asla erişilemez. Şimdi az önceki sözümüzü tutup türetilen sınıf nedir onu bir açıklayalım.

Bir sınıfı başka bir sınıftan türetmek için extends komutunu kullanırız. Örneğin a sınıfını b sınıfından türetmek için yazmamız gereken kod şudur:


class b {

   public function merhaba(){

      echo "Merhaba";

   }

}

class a extends b {

   public function __construct(){
      parent::merhaba();
   }

}

$oop = New a();

Peki bir sınıfı bir başka sınıftan türetirsek nolur ?

Eğer bir sınıfı bir başka sınıftan türetirsek türetilen sınıf içerisinde ki ( private komutuyla oluşturulanlar hariç ) tüm metot ve argümanları türettiğimiz sınıf içerisinden de kullanabiliriz. a sınıfımızın __construct metoduna yazdığımız parent:: komutuyla türetilen sınıf içerisinde ki metodumuzu a sınıfı içerisinde de kullanabiliyoruz. Konuya açıklık getirmek gerekirse yukarıdaki kodumuzu $oop = New a() diyerek a adlı sınıfımızı başlattık. Sınıfımız ekrana “Merhaba” çıktısını verdi.  Ancak biz a sınıfı içerisinde ekrana “Merhaba” yazan bir metot tanımlamadık. Peki nasıl oldu ?

Aslında ekrana “merhaba” çıktısını veren metodumuz b sınıfımız içerisinde ki merhaba metodu. Biz a sınıfımızı b sınıfından türetmiştik. a sınıfımızın __construct metoduna da parent::merhaba() yazdığımız için doğal olarak a sınıfımızı başlattığımız an b sınıfı içerisinde ki merhaba metodu da çalışıyor. Bu olayıda hallettikten sonra asıl konumuza dönelim.

Protected komutuyla oluşturulan metot ve argümanlara yalnızca sınıf içerisinden ve türetilen sınıf içerisinden erişilebilir dedik ve bir örnek vererek konuyu netleştirelim.


class b {

   protected function merhaba(){

      echo "Merhaba";

   }

}

$oop = New b();
$oop->merhaba();

Yukarıdaki kodumuzu çalıştırdığımız da fatal error verecektir. Çünkü protected olarak tanımladığımız bir metoda sınıf dışarısından erişmeye çalıştık. Şimdi bu kodumuzun çalışan halini yazalım.


class b {

   protected function merhaba(){

      echo "Merhaba";

   }

}

class a extends b {

   public function __construct(){
      parent::merhaba();
   }

}

$oop = New a();

Bu şekilde ekrana “Merhaba” çıktısını verecektir.

Static

Eğer bir sınıfın sadece bir metodunu kullanacaksak static komutunu kullanırız. Static komutunun diğerlerinden farkı public static şeklinde bir söz dizimi olmasıdır. Örneğin static $degisken; veya static fonksiyon() şeklinde yazarsak hata ile karşılaşırız. Static olarak tanımlanan bir metodu yada argümanı sınıf içerisinden kullanmak istediğimiz zaman ise self::$degisken yada parent::$degisken şeklinde kullanabiliriz. Burada dikkat etmemiz gereken şey static olarak tanımlanmış olan değerlerin başına $ işaretini koymamız gerektiği. Static olarak tanımlanan tüm metotlar ve argümanlar RAM’e atılır. Çağrıldığı zaman ise direk RAM’den çağrılarak diğer gizlilik komutlarına göre çok daha hızlı çalışır. Böylelikle performans kaybını önlemiş oluruz. Tabi ki bu her metodu static olarak tanımlamızın doğru olduğu anlamına gelmez 🙂 Basit bir örnek vererek konumuzu netleştirelim.


class b {

   public static $sabit = "Oop Dersleri";

   public function yaz(){

      echo self::$sabit;

   }

}

$oop = New b();
$oop->yaz();

Ekran çıktımız: “Oop Dersleri” olacaktır. Performansdan bahsetmişken yukarıda ki örneğimizi biraz daha farklılaştıralım. Kodlarımız:


class b {

   public static $sabit = "Oop Dersleri";

   public function yaz(){

      echo self::$sabit;

   }

}

b::yaz();

Burada ne yaptığımıza bir bakalım. $sabit adında bir static değişken oluşturduk, yaz adında bir public metot oluşturduk ve bu metodumuz içinden $sabit değerini ekrana yazdırdık. Ancak burda new komutu kullanmayıp sınıfı başlatmadığımız halde yine ekrana “Oop Dersleri” değerini yazdırdı.

Php dilinde bir sınıfı çağırmadan da sınıf içerisinde ki metot ve argümanlara erişebiliriz. Bunu yapabilmek için sinifadi::arguman veya sinifadi::metot() şeklinde kullanmamız gerekiyor. Bu şekilde bir kullanım bize sınıf içerisinde 100 tane bile metot olsa sadece bizim istediğimiz metodu yükler ve çalıştırır. __construct ve __destruct ana metotları dahi çalışmaz. Yani sınıfı komple yüklemez. Bu şekilde de performans artışı sağlayabiliriz. Ayrıca içinde static bir değer bulunan bir sınıfı new diyerek başlattığımızda RAM’e her defasında yeni bir obje eklenir. Bu da hafıza da gereksiz bir yer kaplar.  Sonuç olarak 😀 ne kadar new komutuyla tanımlarsak hafıza da o kadar fazla yer kaplamış oluruz.

Final

Final komutu türetilen sınıflarda en son kullanılacak sınıf, metot veya argümanlarda koruma amaçlı kullanılan bir komuttur. Özellikle bileşen (component) yapımında birden çok developer’ın kullanıldığı durumlarda olmazsa olmaz güvenlik mekanizmalarının başında gelir. Final komutu sınıf tanımlamalarının başında kullanılır. Şöyle bir örnek verelim.


final class Bitis(){

}

$oop = new Bitis();

Yukarıdaki gibi final komutuyla tanımlanan bir sınıf başka bir sınıf tarafından türetilemez. Ancak bir başka sınıftan türeyebilir. Şu şekilde bir kullanım yanlıştır.


final class a {

}

class b extends a {

}

$oop = new b();

Burada a sınıfımızı final olarak tanımladığımız için b sınıfımızı da a sınıfından türettiğimiz için hata alırız. Bu kodun doğru olan şekli ise şöyle olmalıdır.


class a {

}

final class b extends a {

}

$oop = new b();

Oop mimarisinde gizlilik kavramları bundan ibarettir arkadaşlar. Bu yazıda neler yaptığımızı öğrendiğimiz yeni komutların ne işe yaradığını tekrar özet geçerek yazımı bitirmek istiyorum.

public : Her yerden erişilebilir.

private : Yalnızca sınıf içerisinden erişilebilir.

protected : Sınıf içerisinden ve türetilen sınıflardan erişilebilir.

static : Bir sınıfın yalnızca bir metodunu kullanıcaksak static tanımlamalıyız.

final : Başka bir sınıf tarafından türetilemez. Koruma amaçlı kullanılır. Sınıfların başında tanımlanır.

$this : Sınıf içerisinde ki herhangi bir metoda erişmek için kullanılır.

parent:: : Türetilen sınıf içerisindeki metotlara erişmek için kullanılır.

self:: : $this komutunun php5’deki halidir. $this yerine self kullanılması önerilir.

sinifadi::metod() : Bir sınıfı komple çağırmadan sadece istenen metodun çağrılmasını sağlar.

sinifadi::arguman : Bir sınıfı komple çağırmadana sadece istenen argumanın çağrılmasını sağlar.

self::$sabit : static olarak tanımlanan bir objenin çağrılmasını sağlar. Unutmamamız gereken static olarak tanımlanan değeri çağırırken önüne $ işareti koymamız gerektiği.

extends : Bir sınıfı başka bir sınıftan türetmek istediğimiz zaman kullanılır.

Umarım faydalı olur arkadaşlar. Bir sonraki yazımızda görüşmek üzere kendinize iyi bakın 🙂

 

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Solve : *
21 − 8 =