Traits i OOP i PHP
Som du redan vet går det inte att ärva från flera klasser samtidigt i PHP, bara från en. Tidigare har vi gått igenom en lösning på detta problem: istället för arv använda objekt från en klass inuti en annan.
I PHP finns det ett annat sätt. Det handlar om att använda traits. Ett trait representerar en uppsättning av egenskaper och metoder som kan inkluderas i en annan klass. Då kommer egenskaperna och metoderna från traitet att uppfattas av klassen som sina egna.
Syntaxen för ett trait är densamma som för en klass,
med undantaget att namnet på traitet behöver
deklareras med hjälp av nyckelordet
trait.
Man kan inte skapa en instans av ett trait - traits
är endast avsedda att anslutas till andra
klasser. Själva anslutningen sker
med kommandot use, efter vilket
namnet på traitet som ansluts anges med mellanslag.
Detta kommando skrivs i början av klassen.
Låt oss titta på användningen av traits med ett praktiskt
exempel. Låt oss säga att vi har ett trait
Helper, som innehåller de privata egenskaperna
name och age, samt deras getters:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Låt oss också säga att vi har en klass User,
i vars konstruktor egenskaperna
name och age sätts:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Låt oss nu lägga till getters för egenskaperna
i vår klass User. Men låt oss inte
skriva dem i själva klassen, utan bara ansluta
traitet Helper, där dessa metoder
redan är implementerade:
<?php
class User
{
use Helper; // ansluter traitet
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Efter anslutning av traitet kommer vår klass att få metoderna och egenskaperna från detta trait. Då kommer vi att komma åt dem som om de vore metoder och egenskaper i själva klassen:
<?php
$user = new User('john', 30);
echo $user->getName(); // kommer att skriva ut 'john'
echo $user->getAge(); // kommer att skriva ut 30
?>
Implementera klassen City med egenskaperna
name, age, population
och getters för dem. Låt vår klass för
förkortning av sin kod använda det trait
Helper som vi redan har skapat.