Traits in OOP in PHP
Zoals je al weet, kan in PHP niet worden overgeërfd van meerdere klassen tegelijk, slechts van één. Eerder hebben we al een oplossing voor dit probleem gezien: in plaats van overerving objecten gebruiken van de ene klasse in de andere.
In PHP is er een andere manier. Het bestaat uit het gebruik van traits. Een trait vertegenwoordigt een reeks eigenschappen en methoden die kunnen worden opgenomen in een andere klasse. Hierbij zullen de eigenschappen en methoden van de trait door de klasse worden gezien alsof ze van zichzelf zijn.
De syntaxis van een trait is hetzelfde als die van een klasse,
met uitzondering van het feit dat de naam van de trait
moet worden gedeclareerd met behulp van het sleutelwoord
trait.
Een instantie van een trait kan niet worden gemaakt - traits
zijn alleen bedoeld om aan andere klassen te worden gekoppeld.
De koppeling zelf wordt uitgevoerd
met het commando use, waarna
met een spatie de naam van de aan te sluiten trait wordt aangegeven.
Dit commando wordt aan het begin van de klasse geschreven.
Laten we de toepassing van traits bekijken aan de hand van een praktisch
voorbeeld. Stel dat we de volgende trait hebben
Helper, die de private eigenschappen
name en age bevat, evenals hun getters:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Stel dat we ook de volgende klasse User hebben,
in waarvan constructor de eigenschappen
name en age worden ingesteld:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Laten we nu getters toevoegen voor de eigenschappen
van onze klasse User. Maar we zullen ze
niet in de klasse zelf schrijven, maar gewoon de
trait Helper aansluiten, waarin deze methoden
al zijn geïmplementeerd:
<?php
class User
{
use Helper; // sluit de trait aan
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Na het aansluiten van de trait verschijnen in onze klasse de methoden en eigenschappen van deze trait. Hierbij zullen we ze benaderen alsof het methoden en eigenschappen van de klasse zelf zijn:
<?php
$user = new User('john', 30);
echo $user->getName(); // geeft 'john' weer
echo $user->getAge(); // geeft 30 weer
?>
Implementeer de klasse City met eigenschappen
name, age, population
en getters ervoor. Laat onze klasse
voor het verkorten van zijn code de reeds door ons gemaakte
trait Helper gebruiken.