Sifa za Ziada katika OOP katika PHP

Kama unavyojua tayari, katika PHP huwezi kurithi kutoka kwa madarasa kadhaa mara moja, moja tu. Hapo awali tumeona tayari suluhisho la tatizo hili: badala ya kurithi tumia vitu vikundi moja ndani ya nyingine.

Katika PHP kuna njia nyingine pia. Inajumuisha matumizi ya sifa za ziada. Sifa ya ziada inawakilisha seti ya mali na mbinu ambazo zinaweza kuingizwa kwenye darasa lingine. Wakati huo huo mali na mbinu za sifa ya ziada zitachukuliwa na darasa kana kwamba ni zake.

Syntax ya sifa ya ziada ni sawa na ya darasa, isipokuwa kwamba jina la sifa ya ziada linahitaji kutangazwa kwa kutumia neno kuu trait.

Hawezi kuunda mfano wa sifa ya ziada - sifa za ziada zinakusudiwa tu kwa kushikamana na madarasa mengine ya darasa. Uunganishaji lenyewe unafanyika kwa kutumia amri use, baada ya hapo kwa nafasi hutajwa jina la sifa ya ziada inayounganishwa. Amri hii imeandikwa mwanzoni mwa darasa.

Wacha tuone utumiaji wa sifa za ziada kwa kivitendo mfano. Hebu tuchukulie tuna sifa ya ziada Helper, iliyo na mali za kibinafsi name na age, pamoja na wapataji wao:

Helper.php<?php
  trait Helper
  {
    private $name;
    private $age;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

Hebu tuchukulie pia tuna darasa User, ambalo kwenye muundaji wake mali name na age huwekwa:

User.php<?php
  class User
  {
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Hebu sasa tuongeze wapataji kwa mali ya darasa letu User. Lakini tusiziandike ndani ya darasa lenyewe, bali tuunganishe sifa ya ziada Helper, ambayo ndani yake mbinu hizi tayari zinatekelezwa:

User.php<?php
  class User
  {
    use Helper; // unganisha sifa ya ziada
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Baada ya kuunganisha sifa ya ziada kwenye darasa letu zitaonekana mbinu na mali za sifa hii ya ziada. Wakati huo huo tutaweza kuziwataka kana kwamba ni mbinu na mali za darasa lenyewe:

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

Tekelezea darasa City lenye mali name, age, population na wapataji wao. Hebu darasa letu kwa ukatizo wa msimbo wake litumie tayari sifa ya ziada Helper tuliyoiunda.