sınıflarda miras alma
bir sınıfın kullanılabilir özellik ve metodlarını başka bir sınıfta da kullanmak istediğimizde miras alma işleminden faydalanırız. PHP de bu işlem için extends kelimesi kullanılır.
şimdi bir hesap makinesi sınıfı yazdığımızı düşünelim. toplama, çıkarma ve çarpma işlemlerini yapan metodlarımız hazır. daha sonra bu hesap makinesine yeni işlemler eklemek istedik, mesela bir sayının karesini de hesaplasın. yeni sınıfı yazarken önceki işlemlerin kodlarını tekrar mı yazacağız?
işte burada miras alma karşımıza geliyor. yeni sınıfı önceki sınıftan türetirsek ortak olan metodları tekrar yazmadan kullanabiliriz. yeni sınıfta da sadece eklemek istediğimiz işlemleri yazarız. böylece toplama işleminde bir değişiklik yapacağımız zaman aynı kodu kopyaladığımız bütün sınıfları tek tek bulup düzeltmek zorunda kalmayız.
bu ilişkide kendisinden türetilen sınıfa üst sınıf (parent), ondan türeyen sınıfa ise alt sınıf (child) denir. örneğimizde Topla_cikar_carp üst sınıf, Hesapla ise alt sınıf olacak.
örnek kodlarımız
aşağıdaki örnekte metodların başına özellikle farklı erişim belirleyicileri yazdım. miras alırken hangi metoda nereden ulaşabildiğimizi de aynı örnek üzerinden görelim.
<?php
class Topla_cikar_carp
{
public $sayi1 = 10;
public $sayi2 = 20;
public function topla()
{
$sonuc = $this->sayi1 + $this->sayi2;
echo "Toplama Sonucu :: " . $sonuc . "<br>";
}
private function cikar()
{
$sonuc = $this->sayi1 - $this->sayi2;
echo "Çıkarma Sonucu :: " . $sonuc . "<br>";
}
protected function carp()
{
$sonuc = $this->sayi1 * $this->sayi2;
echo "Çarpma Sonucu :: " . $sonuc . "<br>";
}
}
class Hesapla extends Topla_cikar_carp
{
public function toplayi_cagir()
{
$this->topla();
}
public function carpmayi_cagir()
{
$this->carp();
}
public function karesini_al()
{
echo "Birinci sayının karesi :: " . ($this->sayi1 * $this->sayi1) . "<br>";
}
}
$ornek = new Topla_cikar_carp();
echo "1 :: ";
$ornek->topla();
$ornek2 = new Hesapla();
echo "2 :: ";
$ornek2->topla();
echo "3 :: ";
$ornek2->toplayi_cagir();
echo "4 :: ";
$ornek2->carpmayi_cagir();
echo "5 :: ";
$ornek2->karesini_al();
// $ornek2->carp(); // hata: protected metoda dışarıdan ulaşılamaz.
// $ornek2->cikar(); // hata: private metoda dışarıdan ulaşılamaz.
bu kodun ekran çıktısı aşağıdaki gibi olacaktır.
1 :: Toplama Sonucu :: 30
2 :: Toplama Sonucu :: 30
3 :: Toplama Sonucu :: 30
4 :: Çarpma Sonucu :: 200
5 :: Birinci sayının karesi :: 100
burada dikkat ederseniz Hesapla sınıfının içine topla adında bir metod yazmadık. buna rağmen $ornek2->topla() dediğimizde toplama işlemi yapıldı. çünkü Hesapla sınıfını extends ile Topla_cikar_carp sınıfından türettik. sayi1 ve sayi2 özelliklerine de yine bu ilişki sayesinde alt sınıfın içinden ulaşabildik.
public, protected ve private farkı
public olan topla metodunu hem nesne üzerinden dışarıdan hem de alt sınıfın içinden çağırabiliyoruz. toplayi_cagir metodu içinde yaptığımız işlem de bunun bir örneği.
protected olan carp metodunu ise doğrudan $ornek2->carp() şeklinde çağıramıyoruz. fakat alt sınıfın içinden $this->carp() diyerek kullanabiliyoruz. carpmayi_cagir metodunu public yaptığımız için dışarıdan bu metodu çağırıyoruz, o da kendi içinde çarpma işlemini çalıştırıyor.
private olan cikar metodunda durum farklı. bu metoda sadece tanımlandığı Topla_cikar_carp sınıfının içinden ulaşılabilir. Hesapla sınıfının içine bir metod yazıp oradan $this->cikar() dememiz de işe yaramaz. yani alt sınıfın içine girince üst sınıftaki bütün kapılar açılmıyor. (çıkarma işlemini de alt sınıfta kullanmak isteseydik erişimini buna göre düzenlememiz gerekirdi.)
kodun en altındaki iki satırı bu yüzden açıklama satırı olarak bıraktım. denemek isterseniz başındaki // işaretlerini birer birer kaldırıp çalıştırın. ikisini birlikte açarsanız ilk hatada program duracağı için diğer satırın sonucunu göremezsiniz.
son olarak karesini_al metodu sadece Hesapla sınıfında bulunuyor. alt sınıfa eklediğimiz bu metod üst sınıfa geri eklenmiş olmaz. dolayısıyla $ornek2->karesini_al() çalışırken, üst sınıftan oluşturduğumuz $ornek üzerinde aynı çağrı çalışmaz. mirasın hangi yönde olduğunu bu iki nesne üzerinden karşılaştırabilirsiniz.
Henüz Yorum Yapılmamış. İlk Yorumu Siz Yapın!