Treitai OOP PHP
Kaip jau žinote, PHP negalima paveldėti iš kelių klasių iš karto, tik iš vienos. Anksčiau jau nagrinėjome šios problemos sprendimą: užuot paveldėjimą naudoti objektus vienų klasių kituose.
PHP yra ir kitas būdas. Jis susideda iš treitų naudojimo. Treitas atstovauja savybių ir metodų rinkinį, kurį galima įtraukti į kitą klasę. Tuo atveju savybės ir treito metodai bus suvokiami klasės lyg jos pačios.
Treito sintaksė yra tokia pati kaip ir klasės,
išskyrus tai, kad treito vardą reikia
apibrėžti naudojant raktinį
žodį trait.
Treito egzempliorių negalima sukurti - treitai
skirti tik prijungimui prie kitų
klasių. Pats prijungimas atliekamas
naudojant komandą use, po kurios
per tarpą nurodomas prijungiamo treito vardas.
Ši komanda rašoma klasės pradžioje.
Pažiūrėkime treitų taikymą praktiniame
pavyzdyje. Tarkime, kad mums duotas toks treitas
Helper, kuriame yra privatūs atributai
name ir age, taip pat jų getteriai:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Tarkime, kad taip pat turime tokią klasę User,
kurios konstruktoriuje nustatomi atributai
name ir age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Dabar pridėkime getterius savybėms
mūsų klasės User. Tik nerašykime
jų pačioje klasėje, o tiesiog prijunkime
treitą Helper, kuriame šie metodai
jau yra įgyvendinti:
<?php
class User
{
use Helper; // prijungiame treitą
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Prijungus treitą mūsų klasėje atsiras to treito metodai ir savybės. Be to, kreipsimės į juos lyg į klasės metodus ir savybes:
<?php
$user = new User('john', 30);
echo $user->getName(); // išves 'john'
echo $user->getAge(); // išves 30
?>
Įgyvendinkite klasę City su savybėmis
name, age, population
ir jų getteriais. Tegul mūsų klasė
sutrumpindama savo kodą naudoja jau mūsų sukurtą
treitą Helper.