Traits in OOP in PHP

Zoals je al weet, kan in PHP niet worden overgeërfd van meerdere klassen tegelijk, slechts van één. Eerder hebben we al een oplossing voor dit probleem gezien: in plaats van overerving objecten gebruiken van de ene klasse in de andere.

In PHP is er een andere manier. Het bestaat uit het gebruik van traits. Een trait vertegenwoordigt een reeks eigenschappen en methoden die kunnen worden opgenomen in een andere klasse. Hierbij zullen de eigenschappen en methoden van de trait door de klasse worden gezien alsof ze van zichzelf zijn.

De syntaxis van een trait is hetzelfde als die van een klasse, met uitzondering van het feit dat de naam van de trait moet worden gedeclareerd met behulp van het sleutelwoord trait.

Een instantie van een trait kan niet worden gemaakt - traits zijn alleen bedoeld om aan andere klassen te worden gekoppeld. De koppeling zelf wordt uitgevoerd met het commando use, waarna met een spatie de naam van de aan te sluiten trait wordt aangegeven. Dit commando wordt aan het begin van de klasse geschreven.

Laten we de toepassing van traits bekijken aan de hand van een praktisch voorbeeld. Stel dat we de volgende trait hebben Helper, die de private eigenschappen name en age bevat, evenals hun getters:

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

Stel dat we ook de volgende klasse User hebben, in waarvan constructor de eigenschappen name en age worden ingesteld:

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

Laten we nu getters toevoegen voor de eigenschappen van onze klasse User. Maar we zullen ze niet in de klasse zelf schrijven, maar gewoon de trait Helper aansluiten, waarin deze methoden al zijn geïmplementeerd:

User.php<?php
  class User
  {
    use Helper; // sluit de trait aan
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Na het aansluiten van de trait verschijnen in onze klasse de methoden en eigenschappen van deze trait. Hierbij zullen we ze benaderen alsof het methoden en eigenschappen van de klasse zelf zijn:

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

Implementeer de klasse City met eigenschappen name, age, population en getters ervoor. Laat onze klasse voor het verkorten van zijn code de reeds door ons gemaakte trait Helper gebruiken.