🐕

【PHP】ざっくりオブジェクト指向 - クラスとインスタンスと継承

2022/11/13に公開

クラスとインスタンス

オブジェクト指向は、変数と関数をまとめて箱に入れて、ソースコードの再利用性を高める工夫でした。この変数と関数をまとめる箱をクラスとよびます。クラスに入れた変数をプロパティ、関数をメソッドとよびます。よび方は違うだけで、プロパティは変数、メソッドは関数です。

クラスに入れることで、変数と関数を一つにまとめることはできました。しかし、Personにはsuzukitanakaもあり、一つの箱だけでは不十分です。そこで、クラスをコピーして増やせるようにしました。クラスをコピーして生成するのがインスタンスです。生成したインスタンスのプロパティを変更して、suzukitanakaなどのオブジェクトを作ります。

クラスを定義

Personのクラス定義です。

https://github.com/hyada/object-oriented-programming/blob/15f6b4e4a07b27a839ca65ff1bca6e209ccfc7cb/code/sample2-1.php

前半でプロパティ、後半でメソッドを定義します。

プロパティ定義
    private $name;
    private $age;
メソッド定義
    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    public function getName()
    {
        return $this->name;
    }

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

__construct()はコンストラクタとよぶ特別なメソッド(マジックメソッド)で、インスタンス生成時に自動的に実行されます。インスタンス生成時にコンストラクタで、疑似変数$thisを使ってプロパティname ageをセットしました。また、プロパティやメソッドのアクセス権をアクセス修飾子private publicで設定しました。疑似変数とアクセス修飾子は、後ほど説明します。

クラスを継承

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

Person2のクラス定義です。
https://github.com/hyada/object-oriented-programming/blob/15f6b4e4a07b27a839ca65ff1bca6e209ccfc7cb/code/sample4-1.php

extendsでクラスを継承します。親クラスからの変更分を子クラスでコーディングします。Personを継承したので、Person2でもgetName() getAge()を使えます。プロパティsexをセットするために、コンストラクタをオーバーライドしました。プロパティname ageは、親クラスのコンストラクタを転送コールparent::してセットしました。転送コールは、後ほど説明します。

メソッドをコール
$person_a = new Person2('suzuki', 28, 'male');
$person_a_sex = $person_a->getSex();
実行結果
hiroyuki@blocs ~ % php sample4-1.php 
string(4) "male"
hiroyuki@blocs ~ %

ざっくりオブジェクト指向(全5記事)

  1. オブジェクト指向の必要性
  2. クラスとインスタンスと継承
  3. インスタンスを生成
  4. staticと遅延静的束縛
  5. アクセス権とカプセル化

Discussion

ログインするとコメントできます