Traituri în OOP în PHP
După cum știți deja, în PHP nu puteți moșteni de la mai multe clase simultan, doar de la una. Anterior am discutat deja soluția acestei probleme: în loc de moștenire, să folosim obiecte unor clase în interiorul altora.
În PHP există și o altă metodă. Aceasta constă în utilizarea traiturilor. Un trait reprezintă un set de proprietăți și metode care pot fi incluse într-o altă clasă. În acest caz, proprietățile și metodele traitului vor fi percepute de clasă ca și cum ar fi ale sale.
Sintaxa unui trait este aceeași ca și a unei clase,
cu excepția faptului că numele traitului trebuie
să fie declarat folosind cuvântul cheie
trait.
Nu puteți crea o instanță a unui trait - traiturile
sunt destinate doar conectării la alte
clase. Conectarea în sine se realizează
cu ajutorul comenzii use, după care
se indică prin spațiu numele traitului de conectat.
Această comandă se scrie la începutul clasei.
Să vedem aplicarea traiturilor pe un exemplu
practic. Să presupunem că avem dat acest trait
Helper, conținând proprietățile private
name și age, precum și gettere pentru acestea:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Să presupunem că avem și această clasă User,
în constructorul căreia sunt setate proprietățile
name și age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Acum să adăugăm gettere pentru proprietățile
clasei noastre User. Doar că nu le vom
scrie în clasa în sine, ci pur și simplu vom conecta
traitul Helper, în care aceste metode
sunt deja implementate:
<?php
class User
{
use Helper; // conectăm traitul
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
După conectarea traitului, în clasa noastră vor apărea metodele și proprietățile acestui trait. În acest caz ne vom adresa la ele ca și cum ar fi metode și proprietăți ale clasei în sine:
<?php
$user = new User('john', 30);
echo $user->getName(); // va afișa 'john'
echo $user->getAge(); // va afișa 30
?>
Implementați clasa City cu proprietățile
name, age, population
și gettere pentru acestea. Să presupunem că clasa noastră
pentru a-și scurta codul folosește traitul deja creat
de noi Helper.