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:

Helper.php<?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:

User.php<?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:

User.php<?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:

index.php<?php
  $user = new User('john', 30);
  echo $user->getName(); // kiírja 'john'-t
  echo $user->getAge();  // kiírja 30-at
?>
Задание 1

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.