PHP OOP abstract

Yazılım geliştirme sürecinde yazılımın mimarisi için sıklıkla kullanılan soyut sınıflar, soyutlama veya abstract class yapısı ile ilgili bilgiler yer almaktadır.

PHP OOP abstract class nedir?

Soyutlama (nesnenin modellenmesi) OOP ile yazılım geliştirmede önemli bir tutar. Nesne modellemek için soyut sınıflardan yararlanılır.

Soyut sınıflar, nesne tanımının yapıldığı OOP class yapısına benzer.

Soyut sınıf tanımlamak için abstract anahtar kelimesi kullanılır.

<?php

abstract class Ogrenci {

}

?>

Soyut sınıflar new anahtar kelimesiyle nesne haline getirilemez / örneklenemez.

<?php

abstract class Ogrenci {

}

$ben = new Ogrenci(); // hata verir.

?>

Soyut sınıf içinde özellikler ve metotlar olabilir.

Özellikler ve metotlar erişim belirleyicilere sahip olabilir.

Ancak soyut sınıf tanımı gereği private erişim belirleyicisinin kullanılmaması beklenir.

<?php

abstract class Ogrenci {

  protected $ogrenciID = 0;
  protected $ogrenciAdi = "";
  protected $ogrenciSoyadi = "";

  public function ogrenciBilgileri() {
    return $this->ogrenciID . " - " . $this->ogrenciAdi . " " . $this->ogrenciSoyadi . "<br />";
  }

}

?>

Soyut sınıflar static / const özelliklere ve static metotlara sahip olabilir.

<?php

abstract class Ogrenci {

  protected static $ogrenciSayisi = 0;
  protected $ogrenciID = 0;
  protected $ogrenciAdi = "";
  protected $ogrenciSoyadi = "";

  public function ogrenciBilgileri() {
    return $this->ogrenciID . " - " . $this->ogrenciAdi . " " . $this->ogrenciSoyadi . "<br />";
  }

  public static function ogrenciSayisi() {
    return self::$ogrenciSayisi;
  }

}

?>

Soyut sınıflar kuruculara ve yıkıcılara sahip olabilir.

Soyut sınıflar new anahtar kelimesiyle örneklenmediğinden kurucuların ve yıkıcıların kullanımı bazen gereksiz olabilir.

<?php

abstract class Ogrenci {

  protected static $ogrenciSayisi = 0;
  protected $ogrenciID = 0;
  protected $ogrenciAdi = "";
  protected $ogrenciSoyadi = "";

  public function __construct($oAdi, $oSoyadi) {
    $this->ogrenciID = self::$ogrenciSayisi + 1;
    $this->ogrenciAdi = $oAdi;
    $this->ogrenciSoyadi = $oSoyadi;
    self::$ogrenciSayisi++;
  }

  public function ogrenciBilgileri() {
    return $this->ogrenciID . " - " . $this->ogrenciAdi . " " . $this->ogrenciSoyadi . "<br />";
  }

  public static function ogrenciSayisi() {
    return self::$ogrenciSayisi;
  }

}

?>

Soyut sınıflar, sınıflar tarafından extends ile kalıtım alınabilir.

<?php

abstract class Ogrenci {

  protected static $ogrenciSayisi = 0;
  protected $ogrenciID = 0;
  protected $ogrenciAdi = "";
  protected $ogrenciSoyadi = "";

  public function __construct($oAdi, $oSoyadi) {
    $this->ogrenciID = self::$ogrenciSayisi + 1;
    $this->ogrenciAdi = $oAdi;
    $this->ogrenciSoyadi = $oSoyadi;
    self::$ogrenciSayisi++;
  }

  public function ogrenciBilgileri() {
    return $this->ogrenciID . " - " . $this->ogrenciAdi . " " . $this->ogrenciSoyadi . "<br />";
  }

  public static function ogrenciSayisi() {
    return self::$ogrenciSayisi;
  }

}

class UniversiteOgrencisi extends Ogrenci {

  protected $ogrenciBolum = "";

  public function __construct($oAdi, $oSoyadi) {
    parent::__construct($oAdi, $oSoyadi);
  }

}

$ben = new UniversiteOgrencisi("Yusuf Sefa", "SEZER");
echo $ben->ogrenciBilgileri();
echo "Toplam öğrenci sayısı : " . Ogrenci::ogrenciSayisi();

?>

Soyut sınıfların en önemli özelliği soyut metotlardır.

Soyut metotlar final anahtar kelimesinin tersi olarak türetilen sınıfta metodun tekrar yazılmasını zorunlu hale getirir.

Soyut metotların kullanımına örnek olarak ilk orta, lise ve üniversite öğrencilerinin not hesaplamasının farklı olmasıdır.

Bu durumda Öğrenci nesnesi tanımlanırken not hesaplama metodu abstract yapılarak her sınıfın kendine ait hesaplama yapması zorunlu hale gelir.

Benzer şekilde her marka aracın yakıt hesaplaması farklı olacağından araba nesnesine ait yakıt hesaplama metodunun abstract olması faydalı olacaktır.

Soyut metotlar private erişim belirleyicisine sahip olamazlar.

<?php

abstract class Ogrenci {

  protected static $ogrenciSayisi = 0;
  protected $ogrenciID = 0;
  protected $ogrenciAdi = "";
  protected $ogrenciSoyadi = "";

  public function __construct($oAdi, $oSoyadi) {
    $this->ogrenciID = self::$ogrenciSayisi + 1;
    $this->ogrenciAdi = $oAdi;
    $this->ogrenciSoyadi = $oSoyadi;
    self::$ogrenciSayisi++;
  }

  public function ogrenciBilgileri() {
    return $this->ogrenciID . " - " . $this->ogrenciAdi . " " . $this->ogrenciSoyadi . "<br />";
  }

  public static function ogrenciSayisi() {
    return self::$ogrenciSayisi;
  }

  public abstract function notHesapla();  // zorunlu metot

}

class UniversiteOgrencisi extends Ogrenci {

  protected $ogrenciBolum = "";
  protected $ogrenciVize = 0.0;
  protected $ogrenciFinal = 0.0;

  public function __construct($oAdi, $oSoyadi, $oVize, $oFinal) {
    parent::__construct($oAdi, $oSoyadi);
    $this->ogrenciVize = $oVize;
    $this->ogrenciFinal = $oFinal;
  }

  public function notHesapla() {  // metot tanımlanmazsa hata verir.
    return $this->ogrenciVize * 0.4 + $this->ogrenciFinal * 0.6;
  }

}

$ben = new UniversiteOgrencisi("Yusuf Sefa", "SEZER");
echo $ben->ogrenciBilgileri();
echo "Toplam öğrenci sayısı : " . Ogrenci::ogrenciSayisi();

?>

OOP ile yazılım geliştirirken bir metodun abstract metot olması istendiğinde soyut sınıfların kullanılması gerekir.

PHP OOP Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!