ここまでクラスの使い方を説明しましたが、ここで説明したのはあくまで使い方です。では、そもそもどういう処理を行っているのでしょうか。ここではそのイメージをつかんでもらおうと思います。図1を見てください。
クラスというのはクッキーの型のようなものです。そして、この型で生地をくり抜いてオーブンで焼く作業、つまりクッキーそのものを生成するのが「new」というキーワードで、焼きあがったクッキーそのものがインスタンスです。ここで大切なのは、焼き上がったクッキーは皆、同じ形をしています。しかし、それぞれが全く別のものであるということです。同様に、インスタンスもクラスを基に生成されるので同じようなものに見えますが、それぞれが全く別のものなのです。
リスト4では11行目で「new TestScore()」とすることでTestScore型のクッキー、つまりインスタンスが生成され、それを$taroで表しています。同様に、18行目で生成されたインスタンスは同じTestScore型ですが、$taroとは全く別のものであり、それを$hanakoで表しています。
このように同じ形でありながら、全く別のものとして扱えるので、それぞれにたろうさんのデータ、はなこさんのデータという別々のデータを保持できるのです。
ここでは、クラスとインスタンスの関係を、クッキーの型とクッキーのたとえで説明してきました。では、型でくり抜く対象、つまりクッキーの生地に当たるものは何でしょうか。それは、メモリです。クラスをnewする際、コンピュータ内部では必要量のメモリが確保されます。メモリが型でくり抜かれているのです。これがインスタンスの実体です。
そして、その確保されたメモリ分全てが変数、例えば、$taroに格納されているわけではありません。実際に$taroに格納されるのは、インスタンスとして確保されたメモリの位置情報のみです。このように、メモリの位置情報のみを格納した変数を「参照変数」といいます。インスタンスを表す変数は全て参照変数です。
リスト4では、クラスを使い、データをまとめて扱えるようになりました。ところが、いまひとつまとまった感じがしません。それは、関数printScore()へのデータの渡し方に問題があります。リスト4ではせっかく各データをインスタンス内にまとめて格納したのにもかかわらず、もう一度そこから取り出して関数printScore()に渡しています。
せっかくデータをまとめるインスタンスがあるので、関数にはこれをそのまま渡して処理してほしいところです。
リスト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);
実行結果はリスト1と同じです。
大きく変わったところは、関数printScore()の引数がTestScore型1つになったところです。それに伴って、関数内で引数のインスタンス内から各データを「$student->math」のように取得しています(6行目)。また、16行目や23行目のように、関数を利用するところではデータが格納されたインスタンスをそのまま渡しています。
Copyright © ITmedia, Inc. All Rights Reserved.