Značilnosti (Traits) v OOP v PHP
Kot že veste, v PHP ni mogoče podedovati od več razredov hkrati, le od enega. Prej smo že obravnavali rešitev te težave: namesto dedovanja uporabimo objekte enih razredov znotraj drugih.
V PHP obstaja še en način. Gre za uporabo značilnosti (traits). Značilnost predstavlja niz lastnosti in metod, ki jih je mogoče vključiti v drug razred. Pri tem bodo lastnosti in metode značilnosti razred dojemal kot da so njegove.
Sintaksa značilnosti je enaka kot pri razredu,
z izjemo tega, da je ime značilnosti treba
deklarirati s ključno
besedo trait.
Primerka značilnosti ni mogoče ustvariti - značilnosti so
namenjene le priklopu na druge
razrede. Samo povezovanje se izvede
z ukazom use, za katerim
presledek je navedeno ime priklopljene
značilnosti. Ta ukaz je zapisan na začetku razreda.
Poglejmo si uporabo značilnosti na praktičnem
primeru. Naj imamo dano takšno značilnost
Helper, ki vsebuje zasebne lastnosti
name in age, ter njihove getterje:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Naj imamo tudi tak razred User,
v katerega konstruktorju so nastavljene lastnosti
name in age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Dodajmo zdaj getterje za lastnosti
našega razreda User. Vendar jih ne bomo
zapisali v samem razredu, ampak bomo preprosto priklopili
značilnost Helper, v kateri so te metode
že implementirane:
<?php
class User
{
use Helper; // priklopimo značilnost
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Po priklopu značilnosti se bodo v našem razredu pojavile metode in lastnosti te značilnosti. Pri tem se bomo do njih obračali, kot da so metode in lastnosti samega razreda:
<?php
$user = new User('john', 30);
echo $user->getName(); // izpiše 'john'
echo $user->getAge(); // izpiše 30
?>
Implementirajte razred City z lastnostmi
name, age, population
in getterji zanje. Naj naš razred za
skrajšanje svoje kode uporablja že ustvarjeno
značilnost Helper.