80.クラスからインスタンスを生成する ~テンプレートと作成物の関係~
本日はインスタンスについて。
調べているとクラスが型で、インスタンスが実体という説明をよく目にします。
これが自分でイメージが湧くように咀嚼・整理していきたいと思います。
クラスとインスタンスの関係
似たようなものをいくつも作れる仕組みという話を聞くのですが、
「似たようなもの」をクラスとして最初に定義しようとすると難しい気がします。
考え方を逆方向にして見た時に割りとイメージできたので、書いていきます。
果物屋を例に考えてみる
お店には
-
りんご
-
ばなな
-
もも
- なし
- かき
が売っています。
それぞれ、果物の名前、値段、産地が記載された紙もついています。
ただ、これは店主や店員が各々に作ったもので文字の大きさや、文字の色、各順序等が統一されていませんでした。
再利用もできず、新しい果物が入荷する度に都度、紙を手書きで作成していたのです。
統一されていませんが、中の情報は基本的に同じ。
だったら、決まりを作って毎回それを使って値札を作ろう!
と店主は考えました。
値札に書くものは、名前、産地、値段、文字の色は黒で
果物が売り切れたら、値札を発注用の箱に入れるルールに
…。
お付き合いありがとうございました。
そう、この流れがクラスとインスタンスの関係がイメージ湧きやすいなと。
今回の場合だと、もともとは値札の代わりに紙に手書きで毎回使っていました。
これがプログラムだと、個別に書かれた商品用の連想配列などに相当しますよね。
で、統一して使いまわしたいという店主の考えによって作られたのが
データと処理を持ったクラス
ここでは、名前、産地、値段、文字色の「データ」と
発注の「処理」を持った値札「クラス」を作ったイメージです。
そして、値札のルールによって作られた「りんごの値札」、「ももの値札」がインスタンスというわけです。
「クラス」ありきで考えるより、私はイメージがわきやすかったなという印象です。
長くなりましたが、コードで確認してみると
class PriceTag{
public $name;
public $producingArea;
public $price;
public $color;
public function __construct($name, $producingArea, $price, $color){
$this->name = $name;
$this->producingArea = $producingArea;
$this->price= $price;
$this->color = $color;
}
public function OrderFruit(){
$orderFruitName;
$orderFruitName = $this->name;
~処理~
}
}
こんな感じですね。
次はインスタンスを実際に生成する方法を確認します。
インスタンスを生成
クラスからインスタンスを生成するにしても、インスタンスを入れておく「箱」、
つまり変数が必要です。
今回はパイナップルの値札インスタンスを生成します。
$pineapple = new PriceTag("パイナップル","沖縄","700円","黒");
これで、$pineappleという変数にPriceTagクラスから生成されたインスタンスが代入されました。
インスタンスの生成をする際は下記のように記述します。
new クラス名(コンストラクタの引数)
コンストラクタはインスタンス生成時の初期設定のような物でしたね。
今回のPriceTagクラスだと、
public function __construct($name, $producingArea, $price, $color){
~処理~
}
この部分がコンストラクタです。
引数が4つあるので、パイナップルの値札を生成するときも引数を4つ指定していますね。
$インスタンスを入れる変数 = new クラス名(コンストラクタの引数);
この形で覚えておきましょう。
また、$インスタンスを入れる変数の名前を、
そのままインスタンス名と呼ぶそうです。
インスタンスを使う
例えば、
パイナップルの値札インスタンスの値段を知りたい場合
echo $pineapple->price;
とすることで、値段が出力されます。
これは、$pineappleインスタンスのプロパティ「price」のデータを出力してね。という意味ですね。
パイナップルの値札を発注処理に回したい場合は、
$pineapple->OrderFruit();
これで、$pineappleインスタンスのOrderFruitメソッドが実行されます。
基本的にインスタンスの何かにアクセスする場合は
インスタンス名->プロパティorメソッド
の形で行います。
今日のまとめ
- クラスは型、インスタンスは実体。というより、個体をまとめられるテンプレート的存在がクラスで、インスタンスは個体のイメージ。
- インスタンスを生成するときにはnew クラス名()というキーワードを使う。
- new クラス名()でインスタンスを生成した時に、コンストラクタが実行される。
- new クラス名()の()にはコンストラクタに渡す引数を記述する。
インスタンスとクラス、だいぶ長くなりましたが掴めてきた気がします。
もっとカンタンにスパッと「こういうものです。」と説明できるくらい理解したいですね。
では、また。