İçeriğe geç

Php Oop Dersleri 7 – Soyut Sınıflar

Merhaba arkadaşlar,

Uzun bir aradan sonra php oop dersleri eğitim setimize devam ediyoruz. Bir önceki yazımızda oop mimarisinde overloading kullanımı hakkında bilgi vermiştik. Bu yazımızda ise soyut sınıfları(abstract class) inceleyeceğiz.

Soyut sınıf; içinde en az bir soyut metod bulunan ve türetilen sınıflarda bu metodun bulunması zorunlu olan sınıflardır. Burada ki soyut kavramı bu metodların somut işlemleri içermemeleri bu somut işlemleri türetilen sınıflara bırakmasıdır. Daha kesin bir tanım yapılmak gerekirse soyut sınıflar sadece tanımlanıp bırakılır içerisinde herhangi bir işlem yapılmaz.

Oop mimarisinde soyut sınıflar sistematik bir sistem kurmak ve hataları minimize etmek amacıyla kullanılır. Component(bileşen) mantığında olmazsa olmaz yapılardan biridir. Soyut sınıflar normal sınıf tanımlamalarından farklı olarak tanımlanır ve new komutuyla çağırılamazlar. Örnek vermek gerekirse:


<?php

abstract class Soyut {

}

?>

Soyut sınıflar bu şekilde tanımlanmaktadır. Bu noktaya lütfen dikkat edin. Soyut sınıfları türeyen sınıflar üzerine çekilen bir katman olarak düşünebilirsiniz. Başka bir deyişle türeyen sınıflarda soyut metodlar tanımlanmak zorundadır. Kısa bir örnek verelim.

Diyelim ki bir mvc yapınız var. Controller model ve view adında çekirdek işlemler yapan sınıflarınız var. Ve tüm controller dosyalarını bu çekirdekde yer alan controller sınıfından, tüm model dosyalarını da yine çekirdekte ki model sınıfından türetiyorsunuz. Herşey harika olması gereken de budur zaten. Sistem üzerinde mvc çalışma mantığı temel olarak controller/method/parametre olarak çalışıyor diyelim. Ve controller dosyası çağrıldığı zaman bir metod belirtilmezse genel de index yada home adında bir metot oluşturup bu metodu varsayılan olarak çağırırız.

İşte tam bu noktada ana controller dosyası içinde varsayılan olarak çağırılan metodun ismini abstract olarak tanımlayarak türetilen sınıflarda bu metodun olmasını zorunlu hale getirebiliriz. Böylece daha sistematik bir yapı oluşturup, olası hataların önüne geçebilir ve doğru olanı yapmış oluruz. Kafanızda birşeyler canlandıysa konumuza tekrar dönüş yapalım.

Soyut sınıflar içinde soyut bir metod tanımlamak için metodun önüne abstract komutunu koymamız yeterlidir. Burada ince bir noktaya da değinelim. Soyut metodların public yada protected olarak tanımlanması gerekir. Gizlilik konusunda yer alan private, static gibi metot tipleriyle soyut metotlar tanımlanamaz. Bir diğer husus ise soyut sınıflar sadece tanımlanıp bırakılır. Bu hususa Örnek verecek olursak:

<?php

abstract class Controller {

   // Yanlış soyut metod

   abstract public function Metod(){ }

   // Doğru soyut metod

   abstract public function Metod();

}

?>

Aslına bakarsanız soyut sınıf denilmesinin sebebi de tam olarak budur. Şimdi yukarıda ki kullanım örneğinde bahsettiğimiz mvc mimarisinde yer alan soyut sınıf yapısının bir örneğini yaparak konuyu daha da netleştirelim.


<?php

abstract class Controller {

   abstract public function index();

}

class MainController extends Controller {

   public function index(){

      // İşlemler

   }

}

new MainController();

?>

Oop mimarisinde soyut sınıfları kullanmak bu kadar basittir arkadaşlar. Eğer ki MainController sınıfı içerisinde index adında bir metot tanımlamasaydık php derleyicimiz bize “Abstract function Controller::index() cannot contain body…” hatası verecekti.  Peki şöyle bir sınıfımız olduğunu düşünelim.


<?php

abstract class Controller(){

   abstract public function index();

   public function Load(){

      return true;

   }

}

class MainController extends Controller {

   public function index(){ }

}

new MainController();

?>

Controller soyut sınıfımız içerinde iki adet metod bulunuyor. Bu metodlardan index metodunu türettiğimiz MainController sınıfı içerisinde tanımladık. Diğer metodumuzu ise tanımlamadık sizce çalışır mı ?

Evet çalışır. Hani soyut sınıflar içerisinde ki metodlar türetilen sınıflarda kullanılmak zorundaydı dediğinizi duyar gibiyim. Burada bir ayrıntıya daha yer vererek yazımızı burada sonlandıralım.

Soyut sınıflar içerisinde yalnızca soyut olarak tanımlanan metodların türetilen sınıflarda tanımlanması zorunludur. Yukarıda index metodunu abstract olarak tanımladığımız için MainController sınıfı içerisinde bu metodu tanımlamak zorundayız. Eğer Load metoduna abstract olarak tanımlamış olsaydık onu da kullanmak zorundaydık. Php oop dersleri soyut sınıflar yazımız şimdilik bu kadar. Umarım faydalı olmuştur. Kafanıza takılanları yorum olarak yazabilirsiniz. İyi çalışmalar dilerim.

Kategori:PHP

3 Yorum

  1. Umut Web Umut Web

    Hocam neden sadece public ve protected olarak tanımlama yapıyoruz ? Private gibi diğer anlattıklarınızı da kullanabileceğimiz soyut sınıf yazamaz mıyız

    • w3c’ye neden öyle olduğunu bir sormak lazım 🙂 Bir sonraki yazıda nesne arayüzlerinde bu konuyla ilgili detaylı bilgi vereceğim.

  2. Oguzhn Pkt Oguzhn Pkt

    Sonraki yazıyı ne zaman ekliceksiniz ? Eğitimler devam edecek mi ?

Bir cevap yazın

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