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