0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】オブジェクト指向の近道 - 継承とトレイト

Last updated at Posted at 2022-11-15

クラスの継承

クラスはプロパティとメソッドが入った箱ですが、クラスの継承は、クラス(親クラス)をコピーして新しいクラス(子クラス)を作成することです。

継承はコピーですから、子クラスでも親クラスのプロパティとメソッドを利用できます。親クラスをベースに、子クラスで独自にプロパティやメソッドを追加やオーバーライド(上書き)します。親クラスと子クラスがまったく別物なら継承してはいけません。Personを継承してageを追加したPerson2を作成する例です。

Person2のクラス定義です。

class Person2 extends Person
{
    private $age;

    public function __construct($name, $age)
    {
        parent::__construct($name);
        $this->age = $age;
    }

    public function getAge()
    {
        return $this->age;
    }
}

extendsでクラスを継承します。親クラスからの変更分を子クラスでコーディングします。Personを継承したので、Person2でもgetName()を使えます。

追加したプロパティageをセットするために、コンストラクタをオーバーライドしました。プロパティnameは、親クラスのコンストラクタを転送コールparent::してセットしました。転送コールは、後ほど説明します。追加したgetAgeをコールするとageを取得できます。

メソッドをコール
$person_a = new Person2('suzuki', 28);
$person_a_age = $person_a->getAge();

var_dump($person_a_age);
実行結果
int(28)

クラスを継承して子クラスを作成できる

トレイト

トレイトは、クラスと似たソースコードの再利用性を高めるための工夫です。traitでプロパティやメソッドを定義し、それをクラスでuseすると、クラス定義内に書き込んだものと同様に扱えます。

トレイトはクラス定義の一部であり、トレイトからインスタンスを作成することはできません。PHPの単一継承の制約を緩和するためにトレイトを利用できます。

トレイトを使ったPerson2のクラス定義です。

トレイト
trait Age
{
    private $age;

    public function getAge()
    {
        return $this->age;
    }
}
class Person2 extends Person
{
    use Age;

    public function __construct($name, $age)
    {
        parent::__construct($name);
        $this->age = $age;
    }
}

オブジェクト指向の近道(全5記事)

  1. なぜオブジェクト指向が必要か?
  2. クラスとインスタンス
  3. 継承とトレイト
  4. アクセス権とカプセル化
  5. staticと転送コール
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?