連載
» 2017年12月14日 05時00分 公開

PHPの「クラス」と「インスタンス」――「オブジェクト指向」の基礎中の基礎Web業界で働くためのPHP入門(13)(2/3 ページ)

[齊藤新三(著)/山田祥寛(監修),WINGSプロジェクト]

クラスとインスタンスの関係はクッキーの型とクッキー

 ここまでクラスの使い方を説明しましたが、ここで説明したのはあくまで使い方です。では、そもそもどういう処理を行っているのでしょうか。ここではそのイメージをつかんでもらおうと思います。図1を見てください。

図1 クラスとインスタンスの関係

 クラスというのはクッキーの型のようなものです。そして、この型で生地をくり抜いてオーブンで焼く作業、つまりクッキーそのものを生成するのが「new」というキーワードで、焼きあがったクッキーそのものがインスタンスです。ここで大切なのは、焼き上がったクッキーは皆、同じ形をしています。しかし、それぞれが全く別のものであるということです。同様に、インスタンスもクラスを基に生成されるので同じようなものに見えますが、それぞれが全く別のものなのです。

 リスト4では11行目で「new TestScore()」とすることでTestScore型のクッキー、つまりインスタンスが生成され、それを$taroで表しています。同様に、18行目で生成されたインスタンスは同じTestScore型ですが、$taroとは全く別のものであり、それを$hanakoで表しています。

図2 TestScoreと$taroと$hanakoの関係

 このように同じ形でありながら、全く別のものとして扱えるので、それぞれにたろうさんのデータ、はなこさんのデータという別々のデータを保持できるのです。

コラム「参照変数」

 ここでは、クラスとインスタンスの関係を、クッキーの型とクッキーのたとえで説明してきました。では、型でくり抜く対象、つまりクッキーの生地に当たるものは何でしょうか。それは、メモリです。クラスをnewする際、コンピュータ内部では必要量のメモリが確保されます。メモリが型でくり抜かれているのです。これがインスタンスの実体です。

 そして、その確保されたメモリ分全てが変数、例えば、$taroに格納されているわけではありません。実際に$taroに格納されるのは、インスタンスとして確保されたメモリの位置情報のみです。このように、メモリの位置情報のみを格納した変数を「参照変数」といいます。インスタンスを表す変数は全て参照変数です。


関数とのやりとりをクラス型にする

 リスト4では、クラスを使い、データをまとめて扱えるようになりました。ところが、いまひとつまとまった感じがしません。それは、関数printScore()へのデータの渡し方に問題があります。リスト4ではせっかく各データをインスタンス内にまとめて格納したのにもかかわらず、もう一度そこから取り出して関数printScore()に渡しています。

図3 せっかくデータをまとめたのにもう一度ばらばらに取り出している

 せっかくデータをまとめるインスタンスがあるので、関数にはこれをそのまま渡して処理してほしいところです。

図4 インスタンスごと関数に渡す

 リスト4をそのように改良した以下のuseTestScore2.phpを作成し、実行してください。

<?php
require_once("TestScore.php");
 
function printScore(TestScore $student): void
{
    $sum = $student->math + $student->english + $student->japanese;
    $ave = $sum / 3;
    print($student->name."さんの合計: ".$sum." 平均: ".$ave."<br>");
}
 
$taro = new TestScore();
$taro->name = "たろう";
$taro->math = 87;
$taro->english = 92;
$taro->japanese = 74;
printScore($taro);
 
$hanako = new TestScore();
$hanako->name = "はなこ";
$hanako->math = 95;
$hanako->english = 79;
$hanako->japanese = 83;
printScore($hanako);
リスト5 phplesson/chap13/useTestScore2.php

 実行結果はリスト1と同じです。

 大きく変わったところは、関数printScore()の引数がTestScore型1つになったところです。それに伴って、関数内で引数のインスタンス内から各データを「$student->math」のように取得しています(6行目)。また、16行目や23行目のように、関数を利用するところではデータが格納されたインスタンスをそのまま渡しています。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。