Տրեյթները OOP-ում PHP-ում

Ինչպես արդեն գիտեք, PHP-ում հնարավոր չէ միանգամից բազմաթիվ դասերից ժառանգել, միայն մեկից: Նախկինում մենք արդեն անդրադարձել էինք այս խնդրի լուծմանը. ժառանգելու փոխարեն օգտագործել մի դասի օբյեկտներ մյուսների ներսում:

PHP-ում կա մեկ այլ եղանակ: Այն կայանում է տրեյթներ օգտագործելու մեջ: Տրեյթը ներկայացնում է հատկությունների և մեթոդների մի շարք, որոնք կարող են ներառվել մեկ այլ դասի մեջ: Այս դեպքում հատկությունները և տրեյթի մեթոդները դասի կողմից կընկալվեն ասես որպես իրենց սեփականը:

Տրեյթի շարահյուսությունը նույնն է, ինչ դասինը, բացառությամբ, որ տրեյթի անունը պետք է հայտարարվի օգտագործելով trait բանալի բառը:

Տրեյթի օրինակ չի կարելի ստեղծել - տրեյթները նախատեսված են միայն այլ դասերին միանալու համար: Միացումն իրականացվում է use հրամանի միջոցով, որից հետո բացատով նշվում է միացվող տրեյթի անունը: Այս հրամանը գրվում է դասի սկզբում:

Եկեք տեսնենք տրեյթների կիրառությունը գործնական օրինակով: Ենթադրենք մենք ունենք այսպիսի տրեյթ Helper, որը պարունակում է պրիվատ հատկություններ name և age, ինչպես նաև դրանց գետտերները.

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

Ենթադրենք մենք ունենք նաև այսպիսի User դաս, որի կոնստրուկտորում սահմանվում են name և age հատկությունները.

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

Եկեք այժմ ավելացնենք գետտերներ մեր դասի հատկությունների համար: Միայն չենք դրանք գրի դասի ներսում, այլ պարզապես կմիացնենք Helper տրեյթը, որում այդ մեթոդներն արդիրեալացված են.

User.php<?php
  class User
  {
    use Helper; // միացնում ենք տրեյթը
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Տրեյթը միացնելուց հետո մեր դասում կհայտնվեն այդ տրեյթի մեթոդներն ու հատկությունները: Այս դեպքում դրանց կդիմենք ասես դասի սեփական մեթոդներին և հատկություններին.

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

Իրականացրեք City դասը name, age, population հատկություններով և դրանց համար գետտերներով: Թող մեր դասը իր կոդը կրճատելու համար օգտագործի արդեն մեր ստեղծած Helper տրեյթը: