PHP OOP trait

OOP destekleyen diller arasında sadece PHP’de bulunan ve çoklu kalıtım imkanı sağlayan trait ile ilgili bilgiler yer almaktadır.

PHP OOP trait nedir?

PHP içinde bulunan trait yapısı çoklu kalıtım yapmaya imkan sağlar.

Trait yapısı class, abstract ve interface yapısına benzer şekilde tanımlanır.

<?php

trait Insan {

}

?>

Trait new anahtar kelimesiyle nesne haline getirilemez / örneklenemez.

<?php

trait Insan {

}

$ben = new Insan();

?>

Trait yapısı içinde const tanımlanamaz.

<?php

trait Insan {

  //const ADI_SOYADI = "Yusuf Sefa SEZER"; // hata verir.

}

?>

Trait bunların dışında class yapısının sahip olduğu tüm özelliklere sahiptir.

Trait içinde tanımlanan özellikleri ve metotları kullanmak için use anahtar kelimesi kullanılır.

<?php

trait Insan {

  public $adi;
  private $soyadi;

  public function __construct($gelenAdi, $gelenSoyadi) {
    $this->adi = $gelenAdi;
    $this->soyadi = $gelenSoyadi;
  }

  function adiSoyadi() {
    return $this->adi . " " . $this->soyadi;
  }

}

class Ogrenci {
  use Insan;  // Trait özellik ve metotları dahil etmek
}

$ben = new Ogrenci("Yusuf Sefa", "SEZER");

echo $ben->adiSoyadi();

?>

Birden fazla trait virgülle ayrılarak dahil edilir.

<?php

trait Insan {

}

trait Ogrenci {

}

class UniversiteOgrencisi {
  use Insan, Ogrenci;
}

$ben = new UniversiteOgrencisi();

?>

Bir trait başka bir trait’e ait özellikleri ve metotları use anahtar kelimesiyle devralır.

<?php

trait Insan {

  public $adi;
  private $soyadi;

  public function __construct($gelenAdi, $gelenSoyadi) {
    $this->adi = $gelenAdi;
    $this->soyadi = $gelenSoyadi;
  }

  function adiSoyadi() {
    return $this->adi . " " . $this->soyadi;
  }

}

trait Ogrenci {
  use Insan;  // Özellik ve metotları devralır

  public function ogrenciBilgileri() { }

}

?>

Birden fazla trait içinde aynı ada sahip metot olduğunda PHP hata verecektir.

Hatanın önüne geçmek için hangi metodun kullanılacağını insteadof anahtar kelimesiyle belirlenmesi gerekir.

<?php

trait Insan {

  public function AdiSoyadi() {
    return "İnsan Adı Soyadı";
  }

}

trait Ogrenci {

  public function AdiSoyadi() {
    return "Öğrenci Adı Soyadı";
  }

}

class UniversiteOgrencisi {

  use Insan, Ogrenci {
    Insan::AdiSoyadi insteadof Ogrenci;  // Ogrenci yerine Insan tercih edildi.
  }
}

?>

Insan ve Ogrenci içindeki AdiSoyadi metodundan Insan olanı tercih ettik.

Trait içindeki metotlara takmak ad vermek için as anahtar kelimesi kullanılır.

<?php

trait Insan {

  public function AdiSoyadi() {
    return "İnsan Adı Soyadı";
  }

}

trait Ogrenci {

  public function AdiSoyadi() {
    return "Öğrenci Adı Soyadı";
  }

}

class UniversiteOgrencisi {

  use Insan, Ogrenci {
    Insan::AdiSoyadi insteadof Ogrenci;      // Ogrenci yerine Insan tercih edildi.
    Ogrenci::AdiSoyadi as OgrenciBilgileri;  // Ogrenci içindeki AdiSoyadi metoduna OgrenciBilgileri ile erişilebilir.
  }
}

$ben = new UniversiteOgrencisi();
echo $ben->AdiSoyadi();
echo $ben->OgrenciBilgileri();

?>

Trait içindeki Erişim Belirleyiciler as anahtar kelimesiyle değiştirilebilir.

<?php

trait Ogrenci {

  private function AdiSoyadi() {
    return "Öğrenci Adı Soyadı";
  }

}

class UniversiteOgrencisi {

  use Ogrenci {
    Ogrenci::AdiSoyadi as public;  // private olan AdiSoyadi artık public oldu.
  }
}

$ben = new UniversiteOgrencisi();
echo $ben->AdiSoyadi();

?>

Trait içinde abstract metot tanımlanabilir.

<?php

trait Ogrenci {

  private function AdiSoyadi() {
    return "Öğrenci Adı Soyadı";
  }

  abstract public function DersAl($dersAdi);  // Soyut metot tanımlandı.

}

?>

PHP içindeki trait yapısı diğer OOP dillerinde olmadığından ve yeni bir özellik olduğundan kullanılırken dikkat edilmesi gerekir.

PHP OOP Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!