PHP : Nesne Arayüzleri

PHP de bir sınıfı diğer sınıflar için arayüz görevi görecek şekilde kullanmak mümkündür. Yani bir arayüz, tüm eleman fonksiyonların prototipini belirler ve diğer sınıflar bu prototiplere bağlı kalarak fonksiyonları kullanırlar.

En kısa ifadeyle, nesne arayüzleri bir ana sınıf görevi görmektedir.

Nesne arayüzü kullanma mantığı soyutlama yaparak çok biçimlilik yapmaya benzerdir. Nesne arayüzleri, çok biçimlilikten farklı olarak daha sade bir yapı sunarlar. Sadece fonksiyon prototiplerini ve sabitleri içerirler.

Yani, nesne arayüzleri eleman sahaları içermezler. Fakat sabitleri (const) kullanabilirsiniz. Nesne arayüzündeki sabitler, diğer sınıflarda kullanılabilirler fakat değiştirilemezler.

Nesne arayüzlerinde bütün fonksiyonlar public olarak tanımlanır. Fonksiyonların diğer sınıflar tarafından kullanılabilmesi için bu bir zorunluluktur.

Nesne arayüzündeki herbir fonksiyon, bu arayüzü kullanan sınıflarda tekrardan tanımlanmalıdır. Aksi takdirde hata oluşur. Fakat diğer sınıflarda nesne arayüzündeki fonksiyonlardan başka fonksiyonlar tanımlanabilir.

Arayüz kullanma mantığını anlamak kolay. Fakat bu mantığı henüz herhangi bir projede kullanmadığım için çok bilmediğimi söyleyebilirim. Bu yüzden basit bir örnek vererek bu yazıyı bitireceğim. Belki ileride bu konuda daha yetkin bir konumda olursam, daha detaylı örnekler yazabilirim.

Bir araba, bir motosiklet veya bir kamyonet genel olarak “araç” adıyla adlandırılır. Dolayısıyla araba, motosiklet veya kamyonet için bir arayüz oluşturabilir. Hiyerarşi genel olarak aşağıdaki gibi olabilir.

/* Arayüz */
interface arac {
	public function isimAyarla($ad);
	public function isimGuncelle($yeniAd);
}
/* Araba sınıfı */
class araba implements arac { /* ... */ }
/* Motosiklet sınıfı */
class motosiklet implements arac { /* ... */ }

Görüldüğü gibi, interface ve implements anahtar kelimeleriyle arayüzdeki fonksiyonların sadece prototipi belirtilmiştir. Şimdi bu arayüzü kullanarak araba ve motosiklet sınıflarını yazalım.

/* Araba sınıfı */
class araba implements arac {
	public function isimAyarla($ad) {
		echo $ad . " adıyla araba oluşturuldu <br/>";
	}
	public function isimGuncelle($yeniAd) {
		echo "Araba adı " . $yeniAd . " ile değiştirildi <br/>";
	}
}
/* Motosiklet sınıfı */
class motosiklet implements arac {
	public function isimAyarla($ad) {
		echo $ad . " adıyla motosiklet oluşturuldu <br/>";
	}
	public function isimGuncelle($yeniAd) {
		echo "Motosiklet adı " . $yeniAd . " ile değiştirildi <br/>";
	}
}

Arayüzü kullanan iki sınıf yarattık. Bu iki sınıfta, arayüzde prototipleri belirtilen fonksiyonların gövdeleri yazılmıştır. Her sınıfta bu gövde farklı davranacak şekilde düzenlenebilir. Arayüzün sağladığı en büyük avantaj budur.

2 farklı nesne oluşturarak ekran çıktılarına bakalım.

/* Araba nesnesi */
$arac1 = new araba();
$arac1->isimAyarla("Ferrari");
$arac1->isimGuncelle("BMW");
/* Motosiklet nesnesi */
$arac2 = new motosiklet();
$arac2->isimAyarla("Harley Davidson");
$arac2->isimGuncelle("Kawasaki");

Oldukça basit bir örnek oldu. :)

Arayüzlerini genişletmek de mümkündür. Fakat arayüzü genişletirseniz, o arayüzü kullanan tüm sınıfları da genişletmeniz gerekir. Bu büyük bir sorundur.

Böyle bir durumda arayüzü kullanarak bir başka arayüz yaratabilirsiniz.

interface aracGenis extends arac {
	public function isimAyarla($ad);
	public function isimGuncelle($yeniAd);
	public function isimSil($yeniAd);
}

Bu çözüme “Adapter Pattern Design” denilmektedir. Yeni arayüzünüzün üzerinden yeni sınıflar üretmekte serbest davranın.

Benzer Yazılar

Yorumlar

  • hakan , 25 Mart 2013 - 13:56:14

    çok teşekkür ederim ama ben bu php yi öğrenemicem galiba.

    Cevapla
  • prekast , 16 Nisan 2013 - 17:13:52

    Teşekkürler ellerinize sağlık.

    Cevapla
  • Savaş oyunları , 06 Mayıs 2013 - 00:14:05

    güzel bir açıklama olmuş hocam ellerinize sağlık. phpnin zorluklarıyla başa çıkmak oldukça zor.

    Cevapla
  • ismail , 18 Temmuz 2013 - 23:28:53

    nesne arayüzleri profesyonel anlamda yazılım şirketleri tarafından kullanılıyorlar. çünkü firma içinde ana departman veya ekip, daha spesifik işlerle uğraşan küçük takımlara bölünür. her takım da projenin belirli bir bölümüyle ilgilenirler. birbirinden bu kadar kopuk ekipleri birleştirip aynı dili konuşturmanın tek yolu da sınıfları arayüzler üzerinden koordine etmektir. bu sınıfı da genellikle proje lideri hazırlar veya hazırlatır. tüm takımlar bu arayüzü alarak kendi sınıflarının içinde gerçekleştirimini sağlar. sonuç = koca ekip ayrı ayrı çalışsa da ürettikleri şey aynı dili konuşur. arayüzler köprü görevi görür.

    Cevapla
  • beytullah , 09 Nisan 2015 - 17:30:51

    Merhabalar hocam verdiğiniz bilgiler gerçekten çok güzel genel anlamda faydalanıyorum öncelikle teşekkür ediyorum…

    Nesne arayüzünü abstract ayıran özellik nedir ?.Yani her ikisinide aynı işlemi yapabiliyoruz gerçi biri class olarak oluyor ve sınıfıda soyut yapmak gerekiyor.Ama mantık olarak ben iki tane soyut fonksiyon ile bu işi yapabilirim.

    Örneğin

    abstract class insan {

    abstract function ad($ad);
    abstract function addegis($addegis);

    }
    class kisi extends insan {

    function ad ($ad){

    echo $ad.” Adında biri”.””;

    }
    function addegis($addegis){

    echo “Adı değişti Şimdiki Adı:”.$addegis;

    }

    }
    $a = new kisi;
    $a -> ad(“Ali”);
    $a -> addegis(“Veysel”);

    veya atladığım yada karıştırdığım bir yermi var.Veya elma armutumu karıştırıyorum… Bilgilendirirseniz çok sevinirim.

    Teşekkür ediyorum güzel paylaşımlarınız için.

    Cevapla
    • Cem Demir , 09 Nisan 2015 - 17:51:38

      Merhaba, ikisiyle de istediğin şeyleri yaparsın. Interface ile yapabiliyorum diğeriyle niye yapayım veya soyut sınıfla yapabiliyorum interface ile niye yapayım diye düşünme.

      Interface’de oluşturduğun fonksiyonların hepsini, onu extends eden sınıfta tekrar yazmalısın.

      Soyut sınıfta oluşturduğu tüm fonksiyonları, onu extends eden sınıfta tekrar yazmak zorunda değilsin.

      Yani interface kullandığın zaman kuralları koymuş oluyorsun, ben bu fonksiyonları tanımladım, beni kullanmak istiyorsanız herşeyimle kullanın gibi. Bunun getireceği avantajları ve dezavantajları düşünerek seçimini yapmalısın.

      Biz genellikle kişisel düşünüyoruz, yazdığımız kodu sadece kendimize göre yazıyoruz. Bir takım içerisinde kod yazarken bazı kurallar gerekecektir.

      Ayrıca, iki yorum yukarıdaki ismail’in yorumu oldukça iyi bir yorum.

      Cevapla
      • Beytullah , 09 Nisan 2015 - 22:55:44

        Evet şimdi daha iyi anladım.Ekip çalışmalarında ekibin atlanmaması istenen çok önemli yerleri veya buna benzer olayları interface ile yaptırmak mümkün o zaman… Arkadaşın dediği mesela yani… Şimdi daha iyi anladım teşekkür ederim.

        Yeni konular ekleyecekmisiniz php ile ilgili ?

        Cevapla
  • beytullah , 14 Nisan 2015 - 13:07:52

    Hocam iyi günler İnterface için sadece fonksiyonmu geçerli.Yani public $a; şeklince bir değişken tanımlayıp bunu implements edip diğer class’da sarmalama ile değer atamamız mümkünmü yoksa sadece funkstionlar için kullanılan bir olaymıdır.Ben denedim olmadı sanırım sadece function için geçerli …

    Cevapla

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla