Трейтове в ООП в PHP
Както вече знаете, в PHP не може да се наследява от няколко класа едновременно, само от един. По-рано вече разгледахме решението на този проблем: вместо наследяване да се използват обекти от един клас в други.
В PHP има и друг начин. Той се състои в използването на трейтове. Трейтът представлява набор от свойства и методи, които могат да бъдат включени в друг клас. При това свойствата и методите на трейта ще се възприемат от класа сякаш са негови.
Синтаксисът на трейта е същият като този на класа,
с изключение на това, че името на трейта трябва
да се декларира с помощта на ключовата
дума trait.
Не може да се създаде инстанция на трейт - трейтовете
са предназначени само за свързване с други
класове. Самото свързване се осъществява
с помощта на командата use, след която
чрез интервал се посочва името на свързания
трейт. Тази команда се записва в началото на класа.
Нека да разгледаме приложението на трейтове на практичен
пример. Нека имаме даден този трейт
Helper, съдържащ частни свойства
name и age, както и техните гетъри:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Нека имаме и този клас User,
в чийто конструктор се задават свойствата
name и age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Нека сега добавим гетъри за свойствата
на нашия клас User. Само че няма
да ги записваме в самия клас, а просто ще свържем
трейта Helper, в който тези методи
вече са реализирани:
<?php
class User
{
use Helper; // свързваме трейта
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
След свързването на трейта в нашия клас ще се появят методите и свойствата на този трейт. При това ще се обръщаме към тях все едно са методи и свойства на самия клас:
<?php
$user = new User('john', 30);
echo $user->getName(); // ще изведе 'john'
echo $user->getAge(); // ще изведе 30
?>
Реализирайте клас City със свойства
name, age, population
и гетъри за тях. Нека нашият клас за
съкращаване на своя код използва вече създадения
от нас трейт Helper.