Abstract(Soyut) Sınıflar ve Interface(Arayüzler)

Soyut sınıflar, kendisinden türetilecek olan sınıflara arayüz sağlar. Türeteceğiniz yeni sınıfları bir kalıba(arayüz) zorlar ve kalıtımla kod tekrarını azaltır. Soyut sınıfllar, tek başlarına bir anlam ifade etmezler. Bu yüzden soyut sınıflardan nesne üretilemez.

abstract  anahtar kelimesini metot veya sınıfların başlarına yazarak tanımlayabilirsiniz. Eğer bir absract metot tanımladıysanız kesinlikle o metotun sınıfını da abstract olarak tanımlamalısınız. Aksi takdirde hata verecektir.

Soyut metotlara  kendi sınıfı içinde gövde yazılamaz ve türetildiği sınıfta bu metotlar ezilmek(override) zorundadır yani yeniden tanımlanmalıdır.

Teknik bilgieri geçtiğimize göre örneğimize geçelim.

 

Öncelikle örneğin kötülüğü için özür dilerim. Aslında içinde veritabanı işlemleri olan gerçekçi bir örnek yapacaktım fakat anlatması uzun süreceğinden echo'lar ile çok basit bir örnek hazırladım.

Aşağıdaki örnekte Haberler adında soyut bir sınıf tanımladım. Haberler soyut sınıfının içinde sorgu adında bir metot ve bilgi adında soyut bir metot tanımladım.  SporHaberleri ve MagazinHaberleri adında Haberler sınıfını miras alan iki alt sınıf tanımladım.

sorgu metotu tüm alt sınıflarda geçerli fakat soyut olan bilgi metotunu tüm alt sınıflarda yeniden tanımlam, ezmem gerekti. 

<?php

//Soyut sınıf tanımlaması
abstract class Haberler
{

    public function __construct()
    {
        echo "Veritabanına bağladım. <br/>";
    }

    public function sorgu($tablo)
    {
        echo "Select *  from $tablo sorgusuyla verileri çektiğimizi varsayalım";
    }

    // Soyut metot tanımlaması olduğu için gövde yazılmaz.(public abstract function bilgi(){ /****/ })
    public abstract function bilgi();

}


class SporHaberleri extends Haberler
{
    public function __construct()
    {
        parent::__construct();
    }

    // Soyut metotu ezme(override).
    public function bilgi()
    {
        echo "Spor haberi bi başka oluyor. <br/>";
    }
}

class MagazinHaberleri extends Haberler
{
    public function __construct()
    {
        parent::__construct();
    }

    public function bilgi()
    {
        echo "Kimin eli kimin cebinde. <br/>";
    }
}

$x = new SporHaberleri;
$x->bilgi();
$x->sorgu("futbol");

Interface (Arayüzler)

Arayüzler soyut sınıflar ile hemen hemen aynıdır. Alt sınıflara bir standart belirlersiniz ve alt sınıflarda bu standarta uymadığınız zaman hata verir. Soyut sınıf iki temel farkı vardır

  1. Arayüzlerde sadece gövdesiz metot tanımlaması yapabilirsiniz.
  2. Soyut sınıflarda sadece bir kez miras(extends) alarak uygulayabilirken, arayüzlerde istediğiniz kadar uygulayabilirsiniz(implements).

interface anahtar kelimesi ile tanımlanır  ve implements anahtar kelimesi ile sınıflara uygulanır.

Örneğin iki arkadaş veritabanı sınıfı yazıyorsunuz. Amacınız MongoDB ile MySQL veritabanlarından aynı kodlarla veri işlemek. 

interface DB 
{ 
    public function connect(); 
    public function error(); 
    public function get(); 
    //...........
}
<?php

class MongoDB implements DB
{
    public function connect()
    {
        //Kodlar
    }

    public function error()
    {
        //Kodlar
    }

    public function get()
    {
        //Kodlar
    }

}
<?php

class MySQL implements DB
{
    public function connect()
    {
        //Kodlar
    }

    public function error()
    {
        //Kodlar
    }

    public function get()
    {
        //Kodlar
    }

}

implements ile arayüzlerinizi uyguladığınız zaman sınıflarınızın içinde o kuralları uygulamak zorundasınız.


Bu yazımla beraber basit anlatım serimi tamamlıyorum. Eğer tüm OOP yazılarımı okuduysanız PHP 5.6 için öğrenmeniz gereken bir tek traits kaldı. 

Bundan sonraki yazı serim tasarım desenleri ve şu ana kadar anlattıklarımı kapsayan sınıf örnekleri olacaktır. Kendinize iyi bakın.


Kategoriler: PHP