Trait-et në OOP në PHP
Siç e dini tashmë, në PHP nuk mund të trashëgoni nga disa klasa njëherësh, vetëm nga një. Më parë kemi kaluar tashmë zgjidhjen e këtij problemi: në vend të trashëgimisë përdorni objekte të një klase brenda klasave të tjera.
Në PHP ekziston një mënyrë tjetër. Ajo qëndron në përdorimin e trait-eve. Një trait përfaqëson një grup vetish dhe metodash që mund të përfshihen në një klasë tjetër. Në këtë rast vetitë dhe metodat e trait-it do të perceptohen nga klasa sikur të ishin të veta.
Sintaksa e një trait-i është e njëjtë me atë të klasës,
përveç se emri i trait-it duhet të
deklarohet duke përdorur fjalën kyçe
trait.
Nuk mund të krijohet një instancë e një trait-i - trait-et
shërbejnë vetëm për t'u lidhur me klasa të tjera.
Vetë lidhja kryhet
me komandën use, pas së cilës
përmendet emri i trait-it që do të lidhet.
Kjo komandë shkruhet në fillim të klasës.
Le të shohim zbatimin e trait-eve në një shembull
praktik. Le të themi se kemi trait-in e mëposhtëm
Helper, i cili përmban vetitë private
name dhe age, si dhe getter-at e tyre:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Le të themi se kemi edhe klasën e mëposhtme User,
në konstruktorin e së cilës përcaktohen vetitë
name dhe age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Tani le të shtojmë getter për vetitë
e klasës sonë User. Por mos
i shkruajmë ato brenda vetë klasës, thjesht le ta lidhim
trait-in Helper, në të cilin këto metoda
janë implementuar tashmë:
<?php
class User
{
use Helper; // lidhim trait-in
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Pas lidhjes së trait-it, në klasën tonë do të shfaqen metodat dhe vetitë e këtij trait-i. Në këtë rast ne do t'u drejtohemi atyre sikur të ishin metoda dhe veti të klasës vetë:
<?php
$user = new User('john', 30);
echo $user->getName(); // do të shfaqë 'john'
echo $user->getAge(); // do të shfaqë 30
?>
Implementoni klasën City me vetitë
name, age, population
dhe getter-at për to. Le të themi se klasa jonë
për të shkurtuar kodin e saj përdor trait-in
Helper që kemi krijuar tashmë.