Traitok az OOP-ben PHP-ben
Mint már tudjátok, a PHP-ben nem lehet egyszerre több osztálytól örökölni, csak egyetől. Korábban már átvettük ennek a problémának a megoldását: öröklés helyett használjunk objektumokat egyes osztályokban mások belsejében.
A PHP-ben van egy másik módszer is. Ez a traitok használatában rejlik. A trait olyan tulajdonságok és metódusok gyűjteménye, amelyek belefoglalhatók egy másik osztályba. Ebben az esetben a trait tulajdonságai és metódusai úgy fognak viselkedni az osztály számára, mintha a sajátjai lennének.
A trait szintaxisa ugyanaz, mint az osztályé,
kivéve, hogy a trait nevét a
trait kulcsszóval kell deklarálni.
A trait példányát nem lehet létrehozni - a traitok
csak más osztályokhoz való csatolásra szolgálnak.
Maga a csatolás a
use paranccsal történik, amely után
szóközzel elválasztva megadjuk a csatolandó
trait nevét. Ez a parancs az osztály elején kerül megadásra.
Nézzük meg a traitok alkalmazását egy gyakorlati
példán. Tegyük fel, hogy adott a következő Helper
trait, amely tartalmazza a name és age
privát tulajdonságokat, valamint azok getter metódusait:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Tegyük fel, hogy van egy User osztályunk is,
amelynek konstruktorában beállítjuk a name
és age tulajdonságokat:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Most adjunk hozzá getter metódusokat az osztályunk
tulajdonságaihoz. Csak ne magában az osztályban
írjuk le őket, hanem egyszerűen csatoljuk
a Helper traitot, amelyben ezek a metódusok
már implementálva vannak:
<?php
class User
{
use Helper; // trait csatolása
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
A trait csatolása után az osztályunkban megjelennek a trait metódusai és tulajdonságai. Ebben az esetben úgy férünk hozzájuk, mintha magának az osztálynak a metódusai és tulajdonságai lennének:
<?php
$user = new User('john', 30);
echo $user->getName(); // kiírja 'john'-t
echo $user->getAge(); // kiírja 30-at
?>
Valósítsd meg a City osztályt a következő tulajdonságokkal:
name, age, population
és getter metódusokkal ezekhez. Az osztályunk használja
a már általunk létrehozott Helper traitot
a kódja lerövidítése érdekében.