Nesnel Nitelikler


    × Bunları biliyor muydunuz?
"Şablon sihirbazında (Wizard) (5.5.60) sürümünden beri döngülerin sonunda kullanılan : sembolünün kullanım zorunluluğu kaldırılmıştır."


Nesnel Nitelikler (Traits), sınıflar için tasarlanan kodların birden fazla sınıf içerisinde yeniden kullanımını sağlayan yapılardır. Yöntem ve nitelik kümelerini farklı sınıfların içerisinde bağımsız bir şekilde özgürce yeniden kullanımını mümkün hale getirerek tek kalıtım sınırlamalarını azaltmak için tasarlanmıştır. Ayrıca içe içe kod karmaşıklığı azaltarak çoklu kalıtımın da önünü açar. Nesnel nitelikler sınıflara benzemekle birlikte sınıflar gibi örneklenemezler. 

 

 

 

Nesnel Niteliklerin özellikleri şunlardır;

Sadece sınıflarla kullanılabilirler.
Birden çok sınıfta aynı nitelik ve yöntemleri kullandırabilirler.
Yöntemleri gruplayarak kod karmaşıklığını azaltırlar. 
Sınıflar gibi örneklenemezler.
Dahil olduklarını sınıfın bir parçası gibi davranırlar.
Arayüz içerebilirler.

 

 

# Söz Dizimi


Nesnel niteliklerin söz dizimi sınıfların söz dizimine benzemekle birlikte class yerine trait deyimini kullanılır.

<?php trait ExampleTraitName
{
     # Nitelik ve yöntemler
}

 

 

# Nesnel Nitelik (Trait) Oluşturun


Nesnel nitelikler yukarıdaki söz diziminde gösterildiği gibi bir içerikle oluşturulurlar.

Dosya: InfoTrait.php
<?php trait InfoTrait
{
    protected $errors = [];

    public function setError(String $error)
    {
        $this->errors[] = $error;
    }

    public function getErrors() : Array
    { 
        return $this->errors;
    }   
}

Yukarıda bir çok sınıf içerisinde aynı amaçla kullanılacak nitelik ve yöntemlerimizi oluşturduk. Nesnel niteliklerin bize en büyük faydası yazılan nesne kümelerinin istenilen her sınıfta kullanılabilmesidir. 

 

 

# Nesne Niteliği Kullanın


Yukarıda örnek amaçlı oluşturduğumuz trait dosyamızı kullanacağımız sınıf içerisinde class erişim alanı içerisinde use ile belirtilerek dahil ederiz.

Dosya: Automobile.php
<?php class Automobile
{
    use InfoTrait;

    protected $wheel;

    public function setWheelCount(Int $wheel)
    {
        $this->wheel = $wheel;

        if( $this->wheel > 4 )
        {
            $this->setError('Invalid wheel count['.$this->wheel.']');
        }
    }

    public function getWheelCount() : Int
    {
        return $this->wheel;
    }
}

Yukarıda tanımladığımız Automobile:: sınıfımızda yer alan nesnel nitelikle gelen yöntemleri kullanalım.

Dosya: index.php
<?php require 'InfoTrait.php'; require 'Automobile.php';

$automobile = new Automobile;

$automobile->setWheelCount(5);

var_dump($automobile->getErrors());
array(1) { [0]=> string(22) "Invalid wheel count[5]" }

Nesnel nitelikler çağrıldıkları sınıfların bir parçası gibi davranırlar.

<?php trait InfoTrait
{
    protected $errors = [];

    public function getClassName()
    {
        return __CLASS__;
    }

    public function setError(String $error)
    {
        $this->errors[] = $error;
    }

    public function getErrors() : Array
    { 
        return $this->errors;
    }   
}
<?php require 'InfoTrait.php'; require 'Automobile.php';

$automobile = new Automobile;

echo $automobile->getClassName();
Automobile