Nesne Kalıtımı


    × Bunları biliyor muydunuz?
"Başlangıç kontrolcüsü tanımlayarak bu kontrolcüde yer alan kodların diğer tüm kontrolcüler için geçerli olmasını sağlayabilirsiniz."


Bir sınıfın nesnelerinin başka bir sınıfa aktarılabilmesini ifade etmek için kullanılan bir kavramdır. Bir sınıfa ait nitelik ve yöntemlerin birden fazla sınıfta kullanılması gereken durumlarda yaygın olarak kullanılır. Nesne kalıtımı extends deyimi ile gerçekleştirilir. Bu genişletme ile bir sınıf en fazla bir üst sınıfı miras alabilir. Bir sınıfa birden fazla sınıfın özelliklerini kazandırmanın başka yolları vardır. Ancak bu durumun üzerinde başka bir zaman durulacaktır. Bu işlem için bir 2 sınıf gereklidir. İlki alt (çocuk) sınıftır. İkincisi üst (ebeveyn) sınıftır. Bu konunun iyi anlaşılması için Araçlar ve araçların alt türleri olan Otomobil ve Uçak sınıflarını kullanacağız. Bu işlemin söz dizimi aşağıdaki gibidir.

 

 

 

# Söz Dizimi


Bir sınıfı başla bir sınıfla genişletmek için extends deyiminden yararlanılır.

class SelfClass extends ParentClass
{
    # Kodlarınız
}

Sınıfın kendisini miras aldığı üst sınıfa ait tüm nesnelere sanki kendisininmiş gibi kullanır.

 

 

# Üst Sınıfılar (Parent)


Üst sınıflar alt sınıflar tarafından extends deyimi ile miras alınırlar. Üst sınıflar miras alınacak sınıfların üst nesnelerini içerecek şekilde tasarlanmalıdır. Alt sınıflar üst sınıflardan daha dar kapsamlı olmalıdırlar.

Üst sınıfların şu özelikleri içermesi önemlidir;

Daha geniş kapsamlı olmalıdırlar.
Miras alan alt sınıflar için ortak nesneler barındırmalıdır.

Eğer otomobil, uçak, tren gibi araçların her biri farklı özellikler göstermesine karşılık bazı davranışlar yönünden ortak özellik gösterir. Mesela yakıt kullanmaları veya bir renklerinin olması gibi. O yüzden bu sınıfların ortak özelliklerini barındıracak bir üst sınıfa ihtiyaç vardır.

Dosya: Vehicle.php
<?php

class Vehicle
{
    protected $color = 'White';
 
    public function startEngine(Array $connection)
    {
        return $connection;
    }

    public function setColor(String $color)
    {
        $this->color = $color;
    }

    public function getColor() : String
    {
        return $this->color;
    }
}

Tüm araçların ortak özelliklerinden bazıları yakıt kullanmaları ve hareket etmeleridir. Bu bakımdan bu davranışlar Vehicle:: üst sınıfında belirtilmiştir.

 

 

# Alt Sınıflar (Self)


Alt sınıf kavramı bir extends deyimi ile bir üst sınıfın miras alınmasını ifade eden bir kavramdır. Bu yolla kendi yöntem ve niteliklerini genişleten kütüphanelere çocuk sınıflarda denir. Çünkü üst sınıfta ait nitelik ve yöntemsel davranışlar almışlardır.

Dosya: Automobile.php
<?php

class Automobile extends Vehicle
{
    public function wayType()
    {
        return 'Highway';
    }
}
Dosya: Aircraft.php
<?php

class Aircraft extends Vehicle
{
    public function wayType()
    {
        return 'Airline';
    }
}

Şimdi yukarıda alt sınıfların her biri bir renk içereceğinden ve bu renk araçların genel bir özelliği olduğu için bununla ilgili yöntemleri Vehicle:: üst sınıfında tasarladık. Alt sınıflarda ise kendilerine özel yöntem olan yol türü ayrı ayrı belirtilmiştir.

Dosya: index.php
<?php 

require 'Vehicle.php';
require 'Automobile.php';
require 'Aircraft.php'

$automobile = new Automobile;

$automobile->setColor('red');

echo $automobile->getColor();

$aircraft = new Aircraft;

$aircraft->setColor('blue');

echo $aircraft->getColor();
red
blue

 

 

# Üst  Sınıf Nesnelerine Erişim


Üst sınıfın bir nitelik veya yönteminin alt sınıf içerisinde kullanılması gerekebilir. Bu gibi durumlarda parent:: deyiminden yararlanılır.

Dosya: Automobile.php
<?php

class Automobile extends Vehicle
{
    public function wayType()
    {
        return 'Highway';
    }

    public function getWheelColor()
    {
        parent::setColor('blue');
    
        return parent::getColor();
    }
}

Genelde böyle bir kullanıma ilerde değineceğimiz __construct() yapıcısı kullanan üst sınıflara rağmen alt sınıflarda da aynı yöntemin kullanılması ile üst sınıftaki aynı yöntemin yani parent::__construct()'ın işlevini kaybetmemesi gereken durumlarda ihtiyaç duyulur.