PHP'de OOP'de Trait'ler
Bildiğiniz gibi, PHP'de aynı anda birden fazla sınıftan miras alınamaz, sadece bir tane. Bu sorunu çözmek için daha önce bir yöntem görmüştük: miras alma yerine, bazı sınıfların nesnelerini diğerlerinin içinde kullanmak.
PHP'nin başka bir yolu daha var. Bu yol trait'lerin kullanılmasıdır. Bir trait, başka bir sınıfa dahil edilebilen özellik ve metotların bir koleksiyonunu temsil eder. Bu durumda trait'in özellikleri ve metotları, sınıf tarafından kendi özellikleri ve metotları gibi algılanacaktır.
Trait'in sözdizimi, trait adının
trait anahtar kelimesi kullanılarak
bildirilmesi dışında, sınıf ile aynıdır.
Bir trait örneği oluşturulamaz - trait'ler
sadece diğer sınıflara bağlanmak içindir.
Bağlanma işlemi, use komutu ile yapılır,
bu komuttan sonra bir boşluk bırakılarak
bağlanacak trait'in adı belirtilir.
Bu komut sınıfın başında yazılır.
Trait'lerin pratik bir örnek üzerinde
uygulanmasına bakalım. Diyelim ki bize
name ve age özel özelliklerini
ve onların alıcı (getter) metotlarını
içeren Helper adında bir trait verilmiş olsun:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Diyelim ki ayrıca, yapıcı metodunda (constructor)
name ve age özelliklerinin
ayarlandığı User adında bir sınıfımız var:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Şimdi User sınıfımızın özellikleri
için alıcı metotlar (getter) ekleyelim.
Ancak bu metotları sınıfın kendi içine
yazmak yerine, bu metotların zaten
uygulandığı Helper trait'ini bağlayalım:
<?php
class User
{
use Helper; // trait'i bağla
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Trait bağlandıktan sonra, sınıfımızda bu trait'in metotları ve özellikleri ortaya çıkacaktır. Ayrıca, onlara sınıfın kendi metotları ve özellikleri gibi erişeceğiz:
<?php
$user = new User('john', 30);
echo $user->getName(); // 'john' yazdıracak
echo $user->getAge(); // 30 yazdıracak
?>
name, age, population
özellikleri ve bu özellikler için alıcı
metotlara (getter) sahip City
sınıfını uygulayın. Sınıfımız, kodunu
kısaltmak için zaten oluşturduğumuz
Helper trait'ini kullansın.