Aşağıdaki basit bir "trait" ile de tanımlayacağınız sınıflarda her "property" için ayrı ayrı getter/setter metotları tanımlamadan işini görebiliyorsunuz. Kod üstünde gerekli açıklamayı bulacaksınız:
<?php
// "trait"imizi tanımlıyoruz.
trait GetterSetterGenerator
{
// __call sihirli metotu sınıftan bir metot çağrıldığında *tanımlı değilse* çaıştırılır.
public function __call($name, $arguments)
{
// "get"ter ve "set"ter metotlarının ilk 3 karakterini silip küçük harflere dönüştürdüğümüzde "property"in ismini almış olduk.
$property = strtolower(substr($name, 3));
// Burada da ilk üç harfe göre metotumuz "get"ter mi yoksa "set"ter mi diye işlem yapıyoruz.
if (substr($name, 0, 3) == 'set')
$this->$property = $arguments[0];
elseif (substr($name, 0, 3) == 'get')
return $this->$property;
// Metot zincirleme için sınıf örneğini dönderiyoruz.
return $this;
}
}
class User
{
// Bu sınıfta "trait"imizi kullanıyoruz.
use GetterSetterGenerator;
protected $id;
protected $username;
protected $password;
// Burası önemli nokta: Eğer herhangi bir metotu kendiniz tanımlarsanız öncelik sizin tanımladığınızdadır.
// Bu nedenle bu sınıftan oluştuacağınız tüm örneklerde ID hep 88 olarak atanacaktır. Bu metotu silip
// birde öyle denerseniz kendi atadığınız değer atanır.
public function setId($value)
{
$this->id = 88;
return $this;
}
}
$u = new User;
$u->setId(65)
->setUsername('grafitus')
->setPassword('12345');
echo $u->getId(); // 88
echo $u->getUsername(); // grafitus
echo $u->getPassword(); // 12345