【PHP】ざっくりオブジェクト指向 - クラスとインスタンスと継承
クラスとインスタンス
オブジェクト指向は、変数と関数をまとめて箱に入れて、ソースコードの再利用性を高める工夫でした。この変数と関数をまとめる箱をクラスとよびます。クラスに入れた変数をプロパティ、関数をメソッドとよびます。よび方は違うだけで、プロパティは変数、メソッドは関数です。
クラスに入れることで、変数と関数を一つにまとめることはできました。しかし、Person
にはsuzuki
もtanaka
もあり、一つの箱だけでは不十分です。そこで、クラスをコピーして増やせるようにしました。クラスをコピーして生成するのがインスタンスです。生成したインスタンスのプロパティを変更して、suzuki
やtanaka
などのオブジェクトを作ります。
クラスを定義
Person
のクラス定義です。
前半でプロパティ、後半でメソッドを定義します。
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
のクラス定義です。
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 ~ %
Discussion