Trender i OOP i PHP
Som du allerede vet, kan man i PHP ikke arve fra flere klasser samtidig, bare fra én. Tidligere har vi allerede gått gjennom løsningen på dette problemet: i stedet for arv bruke objekter fra en klasse inne i en annen.
I PHP finnes det en annen måte. Den består i bruk av trender. En trend representerer et sett med egenskaper og metoder som kan inkluderes i en annen klasse. Egenskapene og metodene til trenden vil da bli oppfattet av klassen som om de var dens egne.
Syntaksen for en trend er den samme som for en klasse,
bortsett fra at navnet på trenden må
deklareres ved hjelp av nøkkelordet
trait.
Man kan ikke opprette en forekomst av en trend - trender
er kun beregnet for tilkobling til andre
klasser. Selve tilkoblingen utføres
med kommandoen use, etterfulgt av
navnet på trenden som skal kobles til, atskilt med mellomrom.
Denne kommandoen skrives i begynnelsen av klassen.
La oss se på anvendelsen av trender med et praktisk
eksempel. La oss si at vi har denne trenden
Helper, som inneholder de private egenskapene
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;
}
}
?>
La oss si at vi også har denne klassen User,
der egenskapene name og age
settes i konstruktøren:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
La oss nå legge til gettere for egenskapene
i klassen vår User. Men la oss ikke
skrive dem i selve klassen, og i stedet bare koble til
trenden Helper, der disse metodene
allerede er implementert:
<?php
class User
{
use Helper; // kobler til trenden
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Etter tilkobling av trenden vil metodene og egenskapene fra denne trenden dukke opp i klassen vår. Vi vil da kunne bruke dem som om de var metodene og egenskapene til selve klassen:
<?php
$user = new User('john', 30);
echo $user->getName(); // vil skrive ut 'john'
echo $user->getAge(); // vil skrive ut 30
?>
Implementer klassen City med egenskapene
name, age, population
og gettere for dem. La klassen vår,
for å forkorte koden, bruke trenden Helper
som vi allerede har opprettet.