Php de Nesne Yönelimli Programlama - Kalıtım ile sınıfları genişletme

Kalıtım (inheritance) nesne tabanlı programlamanın en temel ve önemli konularından biridir. Kalıtım, bir sınıftan başka sınıfların türetilmesidir. Yani bir sınıfın, başka bir sınıfın özellik ve metotlarını miras olarak almasıdır. Türeyen sınıfa çocuk(child) veya alt sınıf, türetilen sınıfa ise ebeveyn(parent) veya üst sınıf denir.

Alt sınıflar, türetildikleri sınıfların private olmayan özellik ve metotlarına kendi elemanları gibi erişip kullanabilir. Yani alt sınıflardan üst sınıfların sadece public ve protected gizliliğine sahip elemanlarına erişilebilir. Alt sınıftan türetilen nesneler ise, üst sınıfın sadece public elemanlarına erişebilir, fakat private ve protected elemanlarına erişemez. Gizlilik konusu(erişim belirteçleri) hakkında daha fazla bilgi için Php de Nesne Yönelimli Programlama - Erişim belirteçleri yazısına bakabilirsiniz.

Yazılımda birçok sınıfta ortak olan bazı metot ve özellikler varsa; bunları her sınıfta ayrı ayrı yazmak yerine, ortak olan bu özellik ve metotları başka bir sınıfta yazıp daha sonra yazılan bu sınıftan kalıtım yapmak, yani miras almak en mantıklı çözüm olacaktır. Bu sayede, kalıtım bizi aynı kodları gereksiz bir şekilde tekrar tekrar yazma zahmetinden kurtaracaktır.

Php de kalıtım için extends anahtar kelimesi kullanılır. Aşağıdaki örnekte en yalın haliyle bir sınıfın türetilmesi gösterilmiştir. B sınıfı A sınfından türetilmiştir. Yani A sınıfı, B sınıfının üst sınıfıdır.

<?php
class A { }

class B extends A { }
?>

ÖRNEK UYGULAMA:

<?php
/*
alt sınıflar, üst sınıfların sadece public ve protected elemanlarına erişebilir,
private elemanlarına erişemez.
*/
class Kisi
{
    public $adSoyad;
    protected $yas;
    private $tcNo;
}

class Ogrenci extends Kisi
{
    public $ogrNo;

    public function __construct($adSoyad, $yas, $ogrNo)
    {
        $this->ogrNo = $ogrNo;
        $this->adSoyad = $adSoyad;
        $this->yas = $yas;
    }

    public function yazdir()
    {
        echo 'Ad Soyad: ' . $this->adSoyad . '<br>';
        echo 'Yaş: ' . $this->yas . '<br>';
        echo 'Öğrenci No: ' . $this->ogrNo . '<br>';
        // echo 'Tc kimlik no: ' . $this->tcNo . '<br>'; // Undefined property hatası
    }
}

$ogr1 = new Ogrenci('Ahmet Ardahanlı', '29', '176007');
$ogr1->yazdir();

/*
sınıf dışından alt sınıfın nesnesi ile üst sınıfın protected elemanına erişilmez.
sadece public elemanına erişilebilir.
*/
echo $ogr1->adSoyad . '<br>';
echo $ogr1->ogrNo . '<br>';
// echo $ogr1->yas. '<br>'; // Fatal error: Cannot access protected property

// ÇIKTI:
/*
Ad Soyad: Ahmet Ardahanlı
Yaş: 29
Öğrenci No: 176007
Ahmet Ardahanlı
176007
*/

Örnekte Kisi ve Ogrenci adında iki sınıf oluşturulmuştur. Ogrenci sınıfı, Kisi sınıfından türetilmiştir. Ogrenci sınıfından bir nesne üretip kurucu metodumuza ilk değerleri gönderiyoruz. Kurucu metodun içinde üst sınıfın(Kisi) public ve protected elemanlarına ve Ogrenci sınıfının $ogrNo isimli public elemanlarına erişebildik. Eğer üst sınıfın private olarak tanımlanan $tcNo özelliğine erişmek istersek 'undefined property hatası' alırız. Kısaca alt sınıfın içindeyken, üst sınıfın sadece public ve protected elemanlarına erişebildiğimizi tekrar hatırlatmak istedim. Örneğin devamında $ogr1->yazdir(); ile metodumuzu çalıştırıp değerlerimizi ekranda gösteriyoruz.

$ogr1 = new Ogrenci('Ahmet Ardahanlı', '29', '176007');

echo $ogr1->adSoyad . '<br>';
echo $ogr1->ogrNo . '<br>';
// echo $ogr1->yas. '<br>'; // Fatal error: Cannot access protected property

ogr1 nesnesi ile özellik değerlerimize yukarıdaki şekilde olduğu gibi; sınıf dışında doğrudan erişmek istersek sadece public değerlere erişim sağlayabiliriz. Yukarıda ilk nesne üretilirken kurucu metod sayesinde protected bir özellik olan $yas a değer yükleyebilmiştik. Fakat dışardan bu protected özelliğe doğrudan nesne ile erişim sağlayamayız ve ölümcül hatayla karşılaşırız.

Metotları geçersiz kılma (Overriding methods)

Bir sınıf, başka bir sınıftan türetildiğinde üst sınıfın public ve protected metot ve özelliklerini miras olarak aldığını söyledik. Bazen üst sınıfta tanımladığımız bir metodu, alt sınıfta farklı şekilde kullanmak isteyebiliriz. Bunu da aynı metodu alt sınıf içinde aynı isimle tekrar tanımlayarak yapabiliriz. Bu işleme de "metotları geçersiz kılma" veya "metodu ezme" (overriding methods) denir.

ÖRNEK UYGULAMA:

<?php
class A
{
    public function goster()
    {
        echo 'A sınıfı içinde göster metodu çalıştı.';
    }
}

class B extends A
{
   
}

$nesne = new B();
$nesne->goster();

/*
ÇIKTI:
A sınıfı içinde göster metodu çalıştı.
*/

Örnekte A ve B sınıfları oluşturduk. B sınıfı A sınıfınından türetilmiştir. B sınıfından türettiğimiz $nesne değişkeni ile goster metodunu çağırdığımız zaman, A sınıfında public olarak tanımlanan goster() metodu çalışacaktır. Çünkü B sınıfı bu goster() metodunu A sınıfından miras almıştır ve artık kendi elemanı gibi kullanabilmektedir. Peki biz bu goster() metodunu B sınıfı içinde de tanımlarsak ne olacak? Böyle bir durumda alt sınıfın nesnesi ile bu metoda erişmek istersek yeni tanımlanan metot çalışacaktır. İşte bu işleme üst sınıfta tanımlanan metodu, alt sınıfta geçersiz kılmak diyoruz. Örneği şu şekilde değiştirelim.

<?php
class A
{
    public function goster()
    {
        echo 'A sınıfı içinde göster metodu çalıştı';
    }
}

class B extends A
{
    public function goster()
    {
        echo 'B sınıfı içinde göster metodu çalıştı';
    }
}

$nesne = new B();
$nesne->goster();

/*
ÇIKTI:
B sınıfı içinde göster metodu çalıştı.
*/

Dikkat ederseniz B sınıfı içinde, üst sınıftakiyle aynı isimde goster() metodu oluşturduk. B sınıfından üretilen $nesne ile goster() metodunu çağırırsak artık B sınıfında oluşturduğumuz yeni metodumuz çalışacaktır. Yani üst sınıftaki goster() metodunu bu şekilde override etmiş olduk.

ETİKETLER
php ile kalıtımphp ile miras almaphp inheritancephp sınıfları genişletmenesne yönelimli programlamada kalıtımkalıtım yoluyla miras almaphp oop inheritancephp metotları geçersiz kılmaphp overriding methods
Öncekİ Yazı

Php de Nesne Yönelimli Programlama - Kurucu ve yıkıcı metotlar

Sonrakİ Yazı

Php de Nesne Yönelimli Programlama - Final deyimi

İlgili Yazılar