クラスとインスタンス
オブジェクト指向は、変数と関数をまとめて箱に入れて、ソースコードの再利用性を高める工夫です。この変数と関数をまとめる箱をクラスと呼びます。クラスに入れた変数をプロパティ、関数をメソッドと呼びます。呼び方が違うだけで、プロパティは変数、メソッドは関数です。
クラスPerson
に入れることで、変数と関数を一つにまとめることができました。しかし、Person
にはsuzuki
もtanaka
もあり、一つの箱だけでは不十分です。そこで、クラスをコピーして増やせるようにしました。クラスをコピーして生成するのがインスタンスです。生成したインスタンスのプロパティを変更して、suzuki
やtanaka
などのオブジェクトを作ります。
クラスを定義
Person
のクラス定義です。前半がプロパティ(変数)の定義、後半がメソッド(関数)の定義です。__construct()
はコンストラクタと呼ばれる特別なメソッド(マジックメソッド)で、インスタンス生成時に自動的に実行されます。
<?php
class Person
{
public $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
クラスはプロパティ(変数)とメソッド(関数)を定義する
インスタンスを生成
Person
からインスタンスを生成しましょう。PHPの変数は、数値や文字列などのスカラー変数、複数の変数をまとめた配列、そしてオブジェクトの3つに大別できます。クラスから生成したインスタンスは、オブジェクト型の変数に代入して使用します。
変数のタイプ | 使い方 |
---|---|
数値、文字列 |
$a=1; $a=’suzuki’;
|
配列、連想配列 |
$a=[1, 2, 3]; $a=[‘name’ => ‘suzuki’];
|
オブジェクト | $a = new Class(); |
Person
のインスタンス生成と、プロパティname
を取得するソースコードです。インスタンスはnew
で生成します。2つのインスタンスを生成して、$person_a
$person_b
に代入しました。
<?php
class Person
{
public $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
$person_a = new Person('suzuki');
$person_b = new Person('tanaka');
オブジェクト指向は、車やリモコンなどさまざまな物にたとえて説明されることがありますが、これらの例は抽象的すぎて、初級プログラマにとって理解が難しいかもしれません。再利用性を高めるために、関連するプロパティ(変数)とメソッド(関数)をまとめる箱がクラスであり、クラスからインスタンスを生成してオブジェクト型の変数に代入して使うという考え方がオブジェクト指向の基本です。
クラスから生成したインスタンスはオブジェクト型の変数に代入して使う
プロパティとメソッド
インスタンスのプロパティとメソッドには、アロー演算子->
でアクセスします。プロパティは$a->property
で、メソッドは$a->method()
でアクセスできます。生成したインスタンスのメソッドgetName()
をコールしました。これでインスタンスのプロパティname
が取得できます。
$person_a_name = $person_a->getName();
var_dump($person_a_name);
string(6) "suzuki"
コンストラクタの処理を説明します。new
でインスタンスを生成した時の引数suzuki
は、そのままコンストラクタの引数$name
に渡されます。$name
はメソッド(関数)内でしか利用できないローカル変数のため、他のメソッドでは利用できません。引数とプロパティの$name
は外見上は同じように見えますが、実際には異なる変数です。
$name
をgetName
で参照できるように、コンストラクタでプロパティに引数の値をセットしました。自インスタンスのプロパティには、疑似変数$this
でアクセスします。疑似変数$this
もオブジェクト型の変数で、自動でインスタンス自身が代入されます。疑似変数$this
はインスタンス内で自インスタンスをあらわす変数ですので、インスタンス外では使用できません。
public $name;
public function __construct($name)
{
$this->name = $name;
}
クラス定義では疑似変数$this
で自インスタンスのプロパティやメソッドにアクセス