Traity w OOP w PHP
Jak już wiesz, w PHP nie można dziedziczyć od wielu klas jednocześnie, tylko od jednej. Wcześniej poznaliśmy już rozwiązanie tego problemu: zamiast dziedziczenia używać obiektów jednych klas wewnątrz innych.
W PHP istnieje inny sposób. Polega on na użyciu traitów. Trait reprezentuje sobie zbiór właściwości i metod, które można dołączyć do innej klasy. Przy tym właściwości i metody traita będą postrzegane przez klasę jako swoje.
Składnia traita jest taka sama jak klasy,
z wyjątkiem tego, że nazwę traita należy
deklarować za pomocą słowa kluczowego
trait.
Nie można utworzyć instancji traita - traity
są przeznaczone tylko do podłączania do innych
klas. Samo podłączenie odbywa się
za pomocą komendy use, po której
przez spację podaje się nazwę podłączanego
traita. Ta komenda jest zapisywana na początku klasy.
Przyjrzyjmy się zastosowaniu traitów na praktycznym
przykładzie. Załóżmy, że mamy dany taki trait
Helper, zawierający prywatne właściwości
name i age, a także ich gettery:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Załóżmy, że mamy również taką klasę User,
w konstruktorze której ustawiane są właściwości
name i age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Dodajmy teraz gettery dla właściwości
naszej klasy User. Tylko nie zapisujmy
ich w samej klasie, a po prostu podłączmy
trait Helper, w którym te metody
są już zaimplementowane:
<?php
class User
{
use Helper; // podłączamy trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Po podłączeniu traita w naszej klasie pojawią się metody i właściwości tego traita. Przy tym odwoływać się do nich będziemy jak do metod i właściwości samej klasy:
<?php
$user = new User('john', 30);
echo $user->getName(); // wyświetli 'john'
echo $user->getAge(); // wyświetli 30
?>
Zaimplementuj klasę City z właściwościami
name, age, population
i getterami dla nich. Niech nasza klasa dla
skrócenia swojego kodu użyje już stworzonego
przez nas traita Helper.