PHPにおけるオブジェクト指向プログラミングのトレイト

ご存知のように、PHPでは複数のクラスから一度に継承することはできません。継承できるのは一つのクラスからのみです。以前、この問題の解決策として、継承の代わりにあるクラスのオブジェクトを別のクラス内で使用する方法を学びました。

PHPには別の方法もあります。それはトレイトの使用です。トレイトは、他のクラスに組み込むことができるプロパティとメソッドのセットを表します。この時、トレイトのプロパティとメソッドは、クラスによってあたかも自身のものであるかのように認識されます。

トレイトの構文はクラスと同じですが、トレイト名はキーワードtraitを使用して宣言する点が異なります。

トレイトのインスタンスを作成することはできません。トレイトは他のクラスへの接続のみを目的としています。接続自体はコマンドuseを使用して行われ、その後にスペースを置いて接続するトレイトの名前を指定します。このコマンドはクラスの先頭に記述します。

では、実際の例でトレイトの適用を見てみましょう。ここに、プライベートプロパティnameとage、およびそれらのゲッターを含むHelperというトレイトがあるとします。

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

また、コンストラクタ内でプロパティnameとageが設定されるUserクラスがあるとします。

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

では、Userクラスのプロパティに対してゲッターを追加しましょう。ただし、クラス内に直接記述するのではなく、これらのメソッドがすでに実装されているトレイト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

プロパティname、age、population、およびそれらのゲッターを持つCityクラスを実装してください。作成済みのトレイトHelperを使用して、コードを短縮させます。