Php OOP Dersleri – Kalıtım

Merhaba arkadaşlar, Phphocasi.com.tr için hazırladığımız php derslerimizde bu ders Php de Kalıtım (İnheritance) yapısını göreceğiz.  Kalıtım sadece php ye özel bir konu olmayıp OOP yapısını destekleyen bütün programlama dillerinde vardır.  Kalıtım diğer bir adıyla inheritance veya miras alma olarak karşımıza çıkabiliyor. Kafamıza en yatkın miras alma ismiyle devam edelim. Günlük hayatta miras nedir nasıl miras alırız bilmeyen yoktur heralde ? (Klasik babamın malı benim malım mantığı). Kalıtımda da ana sınıfımız baba, Kalıtacağımız, miras alacağımız sınıf ise çocuk oluyor.

Neden Kalıtım Yaparız ?

Peki neden kalıtım yaparız ? Örneğin bir öğrenci bilgi sistemi yazdığımızı düşünelim. Ö.b.s de hocalar ve öğrenciler diye iki adet sınıfımız olsun. Bu iki sınıfın temel özelliği genel anlamda bir kişiyi temsil etmesidir. Yani öğrencide bir kişidir hoca da. Biz burada kişi diye bir sınıf oluşturursak öğrenci ve öğretmeni bu sınıftan miras alarak oluşturabiliriz.

Kalıtımda miras alınarak oluşturulan sınıflar ana sınıfın methodlarını ve değişkenlerini kullanabilirler.  Bir önceki dersimizde public, private,protected anahtar kelimelerinin ne işe yaradığını söylemiştik. Dersi okumayanlar Buradan okuyabilirler.

Not: Php de bir sınıftan kalıtım yapmak için extends anahtar kelimesi kullanılır.

Örneğin: class Kalitilan extend Kalitilacak

Kullanacağımız bazı anahtar kelimeler:

self: Bulunduğumuz sınıfı işaret eder. $this ile aynıdır ama $this static methodlarda çalışmazken self statik methodlarda çalışır. Php 5 sürümünden sonra self yerine static kullanılması öneriliyor.

static:  static anahtar kelimesi static methodlar içerisinde $this yerine kullanılır.

parent:  Miras aldığımız sınıfta ana sınıfın  izin verilen özelliklerine erişebilmemizi sağlar.

const: Değeri değiştirilemeyen, sabit bir değişken oluşturmamızı sağlar.

extends:  Ana sınıftan yeni bir sınıf kalıtır.

Şimdi basitçe söylediğimiz örneği yapalım konu daha anlaşılır olsun.

class kisi {  	  	// değişkenlere sınıf dışından ulaşılamasın  	private $adSoyad   	private $tc  	  	// yapıcıya her yerden ulaşılsın.   	public function __construct($adSoyad,$tc) {  		$this->adSoyad = $adSoyad  		$this->tc = $tc  	}  	  	// fonksiyonlara kalıtılan sınıflar ulaşabilsin.   	protected function getAdSoyad() {  		return $this->adSoyad  	}  	  	protected function getTc() {  		return $tc  	}  	  	protected function setAdSoyad($adSoyad){  		$this->adSoyad = $adSoyad  	}  	  	protected function setTc($tc){  		$this->adSoyad = $tc  	}  	  	// bilgileri dışardan yazdırabilelim.  	public function bilgiYazdir() {  		echo "Ad Soyad: $this->adSoyad | Tc: $this->tc"  	}  }    $kisi = new Kisi("Vehbi Akdoğan",11111)    $kisi->bilgiYazdir()

Kişi sınıfımızı yazdık, method ve değişkenler için gerekli anahtar kelimeleri verdik.  Testimizi yaptığımızda sınıfımızın çalıştığınıda görürsünüz.

Şimdi öğrenci sınıfı oluşturalım ve kişi sınıfından extend edelim.

// öğrenci sınıfı  class Ogrenci extends kisi {  	 // extra gelen özellik. Öğrenci Numarası ekledik.  	private $ogrenciNo  	  	public function __construct($adSoyad,$tc,$ogrNo) {  		$this->ogrenciNo = $ogrNo  		parent::__construct($adSoyad,$tc) // genel sınıfımızın yapıcısını çağırdık.  	}  	  	public function getOgrNo() {  		return $this->ogrenciNo  	}  	  	public function setOgrNo($ogrNo) {  		$this->ogrenciNo = $ogrNo  	}  	public function ogrenciBilgiYazdir() {  		echo " | Öğrenci No: $this->ogrenciNo ".parent::bilgiYazdir()   	}  }    $ogrenci = new Ogrenci("Vehbi Akdoğan",1111,25)    $ogrenci->ogrenciBilgiYazdir()

Öğrenci sınıfımızıda yazıp test ettiğimizde öğrenci bilgilerimizinde yazdığını görürüz. Şimdi Öğretmen sınıfımızı hazırlayalım.

 

class Ogretmen extends kisi{   	private $ogretmenNo  	private $ogrenciler = array() // burada hocaya ait öğrenci ekleyelim.   	  	public function __construct($adSoyad,$tc,$ogrNo) {  		$this->ogretmenNo = $ogrNo  		parent::__construct($adSoyad,$tc) // genel sınıfımızın yapıcısını çağırdık.  	}  	  	public function getOgrNo() {  		return $this->ogretmenNo  	}  	  	public function setOgrNo($ogrNo) {  		$this->ogretmenNo = $ogrNo  	}  	  	public function ogrenciEkle($ogrenci) {  		  		$this->ogrenciler[] = $ogrenci  	}  	  	public function ogrenciListele() {  		foreach($this->ogrenciler as $ogrenci) {  			  			echo $ogrenci->bilgiYazdir()." <br/>"  			  		}  	}  	  	  }    $ogrenci1 = new Ogrenci("Vehbi Akdoğan",1111,25)  $ogrenci2 = new Ogrenci("Taha Kırca",123123,26)  $ogrenci3 = new Ogrenci("Eren Başaran",145151,27)  $ogrenci4 = new Ogrenci("Alper Beyler",155445,28)  // 4 adet öğrenci ekledik.   $ogretmen1 = new Ogretmen("Mobilhanem",123456,1)  $ogretmen2 = new Ogretmen("Phphocasi.com.tr",1234567,2)    // öğretmen 1 e 4 öğrenci ekledik.  $ogretmen1->ogrenciEkle($ogrenci1)  $ogretmen1->ogrenciEkle($ogrenci2)  $ogretmen1->ogrenciEkle($ogrenci3)  $ogretmen1->ogrenciEkle($ogrenci4)    // öğretmen 2 ye iki öğrenci ekledik  $ogretmen2->ogrenciEkle($ogrenci3)  $ogretmen2->ogrenciEkle($ogrenci4)    //Şimdi bilgileri yazdıralım    echo "1. Öğretmenin Öğrencileri <br/>"  $ogretmen1->ogrenciListele()  echo "<br/><br/>2. Öğretmenin Öğrencileri <br/>"  $ogretmen2->ogrenciListele()

Kodları yazıp çalıştırdığımızda aşağıdaki gibi bir çıktı alırız.

Peki Amaç Neydi ?

Evet arkadaşlar uğraştık birşeyler yaptık çalıştırdık ama elimize ne geçti ?

  • Kod kalabalığından kurtulduk. Öğrenci ve öğretmen için tekrar tekrar ad soyad fonksiyonları yazmadık.
  • Yeni bir sınıf oluşturmak istersek: Örneğin Müdür adında bir sınıf oluşturmak istersek elimizde kişi sınıfı olduğu için yine kişi sınıfından kalıtarak sadece müdüre özel methodlar ekleyerek işimizi kolaylaştırabiliriz.
  • Kod okunurluğumuzu artırmış olduk.

Aklıma geldiği kadar amacımızı yazdım arkadaşlar maddeler eklenebilir.

 

 

Bir php dersimizin daha sonuna geldik arkadaşlar.

Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı yine konu altından ve Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.

Tüm php dersleri için tıklayınız..

 

1
Üzerine gel