Треитови у ООП у 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.