データをまとめる方法としてクラスを導入しました。実は、このクラスの役割はデータをまとめるだけではありません。ここからは、その点を見ていきましょう。
リスト5で関数の引数をクラス型にし、複数のデータをまとめて渡すことで少しスッキリしました。しかし、まだ無駄があります。それは「インスタンスへデータを格納すること」「データを処理してもらう関数にデータが格納されたインスタンスを渡すこと」の2つ、つまり、データと処理を結び付けるのを実行部分で行っていることです。
どうせクラス内のデータを使って処理を行うのなら、処理そのものをクラス内に含められれば全てがクラス内で完結し、便利です。
では、TestScoreクラスをそのように改良したTestScoreWithMethodクラスを作成してみましょう。クラス作成のルールにのっとって、これは、TestScoreWithMethod.phpファイルに記述します。
<?php class TestScoreWithMethod { public $name = ""; public $math = 0; public $english = 0; public $japanese = 0; public function printScore(): void { $sum = $this->math + $this->english + $this->japanese; $ave = $sum / 3; print($this->name."さんの合計: ".$sum." 平均: ".$ave."<br>"); } }
これが、クラスの形です。クラスにはデータと処理を一緒に含めることができます。そして、データは変数と、処理は関数と同じ記述方法です(ただしpublicが付きます)。ただ、名称が変わります。クラス内のデータ部、つまり変数のことを「プロパティ」、処理部、つまり関数のことを「メソッド」といいます。そして、プロパティとメソッドを合わせて「メンバ」といいます。
構文としてまとめると以下のようになります。
class クラス名
{
public 変数名; ← プロパティ
:
public function メソッド名(引数) ←メソッド
{
処理;
}
:
}
ところで、プログラムでは、記述した順序通りに処理されることは今までの解説で理解していると思います。従って、実行部分や関数内ではソースコードの記述順序は大切です。これはメソッド内でも同じです。
ところが、クラス内のメンバ同士の記述順序は不問です。例えば、リスト6は以下のように記述しても問題なく動作します。
class TestScoreWithMethod { public $name = ""; public $math = 0; public function printScore() { : } public $english = 0; public $japanese = 0; }
とはいっても、リスト6のようにプロパティはプロパティで、メソッドはメソッドでまとめて記述した方が読みやすいです。
ここでリスト6で追加したメソッドを見てみましょう。基本の処理はリスト5のprintScore()関数と同じですが、違うところがあります。
まず、リスト5のprintScore()は外部からデータをもらう必要があるため、引数が必要でした。一方、リスト6のprintScore()メソッドはクラス内部のプロパティを使うため引数は不要です。
そのクラス内部のメンバにアクセスするには「$this」を使います。リスト6の11行目が該当します。
「$this」というのは自分自身を指します。例えば、「$taro->name」というのは変数$taroが表すインスタンス中のプロパティnameです。これはインスタンスを外から見た状態です。一方、「$this->name」というのは自分自身のインスタンスの中のプロパティnameです。こちらはインスタンスを中から見た状態です。
では、メソッドが追加されたTestScoreWithMethodクラスを使うように実行部分を書き換えましょう。以下のuseTestScoreWithMethod.phpを作成し、実行してください。
<?php require_once("TestScoreWithMethod.php"); $taro = new TestScoreWithMethod(); $taro->name = "たろう"; $taro->math = 87; $taro->english = 92; $taro->japanese = 74; $taro->printScore(); $hanako = new TestScoreWithMethod(); $hanako->name = "はなこ"; $hanako->math = 95; $hanako->english = 79; $hanako->japanese = 83; $hanako->printScore();
実行結果はリスト1と同じです。
TestScoreWithMethodクラスを使うので、ファイルの読み込み部分である2行目と、このクラスをnewする4行目と11行目が変更になっています。
さらに、表示処理を行っていたprintScore()がTestScoreWithMethodクラスのメソッドになったので、単にprintScore()と記述するのではなく、「$taro->printScore()」や「$hanako->printScore()」という記述になっています。これは、それぞれ$taroインスタンスのメソッドprintScore()、$hanakoインスタンスのメソッドprintScore()を呼び出す記述です。
このように、メソッドもプロパティと同様に「変数名->メンバ名」でアクセスできます。もしメソッドに引数が必要でしたら、()内に記述することで渡すことができます。
次回もこの続きとして、クラスの構文を拡げ、アクセス修飾子とアクセサメソッド、コンストラクタなどについて扱います。
Copyright © ITmedia, Inc. All Rights Reserved.