PHP Kalıtım

Merhaba arkadaşlar bu yazımızda PHP Kalıtım yani miras alma konusunu ele alacağız.

PHP Kalıtım Nedir ?

Php dilinde ya da herhangi bir nesne yönelimli programlama dilinde bir sınıfın başka bir sınıftan türetilebilmesi kalıtım yoluyla gerçekleşir. Yani tam anlamıyla kalıtım public ya da protected özellik ve fonksiyonların türetilen başka sınıf tarafından devralınmasıdır.

Miras alınan sınıfı belirtmek için extends anahtar sözcüğünü kullanırız.

Basit bir kalıtım örneği:

<?php
class Insan {
  public $isim;
  public $yas;
  public function __construct($isim, $yas) {
    $this->isim = $isim;
    $this->yas = $yas;
  }
  public function bilgi() {
    echo "Kişinin adı: {$this->isim} ve kişinin yaşı {$this->yas}.";
  }
}
 
class Zafer extends Insan {
  public function message() {
    echo "Demek ben türetilen bir sınıfım ";
  }
}
$zafer = new Zafer("Zafer", "26");
$zafer->message();
echo "<br>";
$zafer->bilgi();
?>

Yukarıdaki örnekte Insan sınıfı tanımlanmış. İsim ve yaş adında public özelliğinde 2 değişken tanımlanmış ve bu değişkenler constructor metodunda kullanılmış. Constructor metodu bildiğiniz üzere sınıf çağırıldığında otomatik olarak çalışıyor. Zafer sınıfını ise extends kelimesi ile Insan sınıfından türetilmiştir.

$zafer adında bir değişkene Zafer nesnesi tanımlanmış ve içine parametre olarak Zafer ve 26 değerleri gönderilmiştir. Ama Zafer sınıfında construct metodu olmamasına rağmen bilgi metodu çalışmıştır. Çünkü bilgi metodu Insan sınıfından miras alınmıştır.

Protected Erişim Belirleyici İle Miras Alma

Yukarıda sadece public ve protected ön ekleriyle tanımlanmış özellik ve metotların miras alınabileceğini söylemiştik. Peki bu ne anlama geliyor ?

Private metot ve özelliklere miras alarak ulaşamayız. Örneği inceleyelim.

<?php
class Insan {
  public $isim;
  public $yas;
  public function __construct($isim, $yas) {
    $this->isim = $isim;
    $this->yas = $yas;
  }
  protected function bilgi() {
    echo "Kişinin adı: {$this->isim} ve kişinin yaşı {$this->yas}.";
  }
}
 
class Zafer extends Insan {
  public function message() {
    echo "Demek ben türetilen bir sınıfım ";
  }
}
$zafer = new Zafer("Zafer", "26");
$zafer->message();
echo "<br>";
$zafer->bilgi(); // Burada hata verecektir. Protected metotlar direk çağırılamaz.
?>

Kodu çalıştırdığımızda hata verecektir. Protected fonksiyonları miras alan sınıf sadece sınıf içinde kullanabilir. Dışarıdan çağırırsa hata verecektir. Doğru kullanımı şu şekildedir.

<?php
class Insan {
  public $isim;
  public $yas;
  public function __construct($isim, $yas) {
    $this->isim = $isim;
    $this->yas = $yas;
  }
  protected function bilgi() {
    echo "Kişinin adı: {$this->isim} ve kişinin yaşı {$this->yas}.";
  }
}
 
class Zafer extends Insan {
  public function message() {
    echo "Demek ben türetilen bir sınıfım <br>";
    $this->bilgi();
  }
}
$zafer = new Zafer("Zafer", "26");
$zafer->message();
 
?>

Miras Alınan Metodu Overriding Etme

Bazı durumlarda üst sınıfta tanımlanan fonksiyon işimizi görmeyebilir. Mirası alan sınıfta aynı isimle fonksiyon tanımlarsak miras alınan sınıftaki fonksiyonu geçersiz kılmış oluruz. Overriding zaten kelime anlamı olarak geçersiz kılma anlamına gelir.

Şimdi aşağıdaki örneği inceleyelim. Miras alan ve alınan 2 sınıfta da construct ve bilgi metodu var. Ama insan sınıfındakiler geçersiz sayılacak ve Zafer sınıfındakiler çalışacaktır. Umarım anlatabilmişimdir . Karmaşık gibi görünen kolay bir olay :)

<?php
class Insan {
  public $isim;
  public $yas;
  public function __construct($isim, $yas) {
    $this->isim = $isim;
    $this->yas = $yas;
  }
  protected function bilgi() {
    echo "Kişinin adı: {$this->isim} ve kişinin yaşı {$this->yas}.";
  }
}
 
class Sare extends Insan {
	public	function __construct($isim,$yas)
	{
		 $this->isim = "Sare";
		 $this->yas = "21";
	}
	public function bilgi( )
	{
		echo "İsim:".$this->isim." ve yaş:".$this->yas;
	}
   
}
$sare = new Sare("Zafer", "26");
$sare->message();
$sare->bilgi();
 
?>

Final Anahtar Kelimesi

Final anahtar kelimesi sınıf kalıtımını önlemek veya metodu geçersiz kılmayı iptal etmek için kullanılır. Bunu direk örnekle açıklamak daha mantıklı olacaktır.

<?php
class Araba {
  final public function intro() {
    // fonksiyon kodları
  }
} 
class Mercedes extends Araba {
  // hata gösterilecek alan
  public function intro() {
    // fonksiyon kodları
  }
}
?>

Yukardaki kodu çalıştırdığınızda şöyle bir sonuç alacaksınız.

Fatal error: Cannot override final method Araba::intro() in C:\xampp\htdocs\egitim\index.php on line 13

Yani intro metodu final ile tanımlandığı için türetilen sınıfta tekrardan intro metodu tanımlanamaz.

YAZAR HAKKINDA

26 Yaşında. Araştırmayı seven, bir şeyler öğretmeye meraklı bir Bilgisayar Mühendisi

0 YORUM

Bu konuya henüz yorum yapılmamış

Yorum Yap

@COPYRIGHT KodlamakLazım Tüm Hakları Saklıdır.