Traits i OOP i PHP
Som du allerede ved, kan man i PHP ikke arve fra flere klasser på én gang, kun fra én. Tidligere har vi allerede genemgået løsningen på dette problem: i stedet for arv skal man bruge objekter fra nogle klasser inde i andre.
I PHP er der en anden måde. Den består i at bruge traits. En trait repræsenterer et sæt af egenskaber og metoder, som kan inkluderes i en anden klasse. Egenskaberne og metoderne fra traiten vil blive opfattet af klassen som om de var dens egne.
Syntaksen for en trait er den samme som for en klasse,
bortset fra at navnet på traiten skal
erklæres ved hjælp af nøgleordet
trait.
Man kan ikke oprette en instans af en trait - traits
er kun beregnet til at blive tilsluttet andre
klasser. Selve tilslutningen udføres
med kommandoen use, efterfulgt af
navnet på den trait, der tilsluttes.
Denne kommando skrives i starten af klassen.
Lad os se anvendelsen af traits i et praktisk
eksempel. Antag, at vi har følgende trait
Helper, som indeholder de private egenskaber
name og age, samt deres gettere:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Antag, at vi også har følgende klasse User,
i hvis konstruktør egenskaberne
name og age bliver sat:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Lad os nu tilføje gettere for egenskaberne
i vores klasse User. Men lad os ikke
skrive dem i selve klassen, men blot tilslutte
traiten Helper, hvor disse metoder
allerede er implementeret:
<?php
class User
{
use Helper; // tilslutter traiten
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Efter tilslutning af traiten vil vores klasse få metoder og egenskaber fra denne trait. Vi vil henvise til dem, som om de var metoder og egenskaber i selve klassen:
<?php
$user = new User('john', 30);
echo $user->getName(); // vil udskrive 'john'
echo $user->getAge(); // vil udskrive 30
?>
Implementer klassen City med egenskaberne
name, age, population
og gettere til dem. Lad vores klasse for
at forkorte sin kode bruge den allerede oprettede
trait Helper.