Tratti nella OOP in PHP
Come già sapete, in PHP non è possibile ereditare da più classi contemporaneamente, solo da una. In precedenza abbiamo già visto una soluzione a questo problema: invece dell'ereditarietà, utilizzare oggetti di alcune classi all'interno di altre.
In PHP esiste un altro modo. Consiste nell'utilizzo dei tratti. Un tratto rappresenta un insieme di proprietà e metodi che possono essere inclusi in un'altra classe. In questo modo le proprietà e i metodi del tratto saranno considerati dalla classe come se fossero propri.
La sintassi di un tratto è la stessa di una classe,
con l'eccezione che il nome del tratto deve
essere dichiarato utilizzando la parola chiave
trait.
Non è possibile creare un'istanza di un tratto - i tratti
sono destinati solo ad essere collegati ad altre
classi. Il collegamento stesso viene effettuato
con il comando use, dopo il quale
viene specificato, separato da uno spazio, il nome del tratto
da collegare. Questo comando viene scritto all'inizio della classe.
Vediamo l'applicazione dei tratti con un esempio
pratico. Supponiamo di avere questo tratto
Helper, contenente le proprietà private
name e age, oltre ai loro getter:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Supponiamo inoltre di avere questa classe User,
nel cui costruttore vengono impostate le proprietà
name e age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Aggiungiamo ora i getter per le proprietà
della nostra classe User. Solo che non
li scriveremo nella classe stessa, ma ci limiteremo a collegare
il tratto Helper, in cui questi metodi
sono già implementati:
<?php
class User
{
use Helper; // colleghiamo il tratto
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Dopo il collegamento del tratto, nella nostra classe appariranno i metodi e le proprietà di questo tratto. Inoltre, ci riferiremo ad essi come se fossero metodi e proprietà della classe stessa:
<?php
$user = new User('john', 30);
echo $user->getName(); // visualizzerà 'john'
echo $user->getAge(); // visualizzerà 30
?>
Implementate la classe City con le proprietà
name, age, population
e i relativi getter. Lasciate che la nostra classe
utilizzi il tratto Helper che abbiamo già creato per abbreviare il proprio codice.