リスト3のように、「プロパティをprivateとして外部からアクセスできないようにして、それにアクセスするためのアクセサメソッドを必要に応じて用意する」ことを「カプセル化」と言います。これは、ちょうどインスタンス内の変数部分がカプセルのように包み込まれていることに起因する用語です。カプセル化は、オブジェクト指向構の大きな特徴の1つです。
ここで少し話を戻して、リスト1のTestScoreの例に戻ります。まずは、ここまでの解説を踏まえて、TestScoreAdvクラスをカプセル化したリスト5のTestScoreCapsuleを考えます。
<?php class TestScoreCapsule { private $name = ""; private $math = 0; private $english = 0; private $japanese = 0; 〜省略〜 }
4〜7行目のプロパティ部分のアクセス修飾子をprivateにしただけです。そのため、その他のメソッドやアクセサメソッドは省略しています。このTestScoreCapsuleを利用するuseTestScoreCapsule.phpはリスト6のようになります。
<?php require_once("TestScoreCapsule.php"); $taro = new TestScoreCapsule(); $taro->setData("たろう", 87, 92, 74); $taro->printScore();
実行結果は下記の通りです。
たろうさんの合計: 253 平均: 84.333333333333
リスト5のTestScoreCapsuleは、今までの話からすると何の問題もないように思えるかもしれませんが、欠点があります。それは、実行用phpファイルであるリスト6の5行目です。setData()メソッドを使ってまとめてデータを登録していますが、この1行を記述し忘れるとデータが登録されず、計算結果がおかしなことになってしまいます。
この欠点を解決するには、どのようにするのがいいのでしょうか。
一番確実な方法は4行目のnewのタイミングでデータを渡すことです。このnewのタイミング、つまり、インスタンスが作成されるタイミングで処理を行う特殊なメソッドのことを「コンストラクタ」と言います。
TestScoreCapsuleにコンストラクタを記述した、リスト7のTestScoreConstructorを作成してください。
class TestScoreConstructor { private $name = ""; private $math = 0; private $english = 0; private $japanese = 0; //コンストラクタ。全データを受け取ってプロパティに格納する。 public function __construct(string $name, int $math, int $english, int $japanese) { $this->name = $name; $this->math = $math; $this->english = $english; $this->japanese = $japanese; } 〜省略〜 }
リスト5同様、その他のメソッドやアクセサメソッドは省略しています。またsetData()メソッドは、もはや不要なので削除してください。
9行目がコンストラクタです。コンストラクタは「__construct」と固定のメソッド名を記述します。引数は必要に応じて必要な数だけ記述します。続く波かっこ内にnewのときの処理を記述します。ただし、戻り値は設定できないので、returnや戻り値の型は記述できません。
構文としてまとめると下記のようになります。
public function __construct(……)
{
インスタンスが生成されるときの処理
}
コンストラクタとは逆に、インスタンスが破棄されるときに処理を行いたい場合は「デストラクタ」に記述します。デストラクタは下記のように記述します。
public function __destruct() {……}
コンストラクタ同様に戻り値は設定できません。また、インスタンスの破棄そのものはnewとは違い、暗黙のうちに行われるため、引数も設定できません。
リスト7のTestScoreConstructorのようにコンストラクタに引数が設定されている場合は、newのときに引数を渡します。例を見てみましょう。リスト8のuseTestScoreConstructor.phpを作成し、実行してください。
<?php require_once("TestScoreConstructor.php"); //たろうさん用のTestScoreConstructorインスタンスを生成。このときにデータを渡す。 $taro = new TestScoreConstructor("たろう", 87, 92, 74); //データ表示処理。 $taro->printScore();
実行結果はリスト6と同じです。
5行目がコンストラクタの呼び出しです。new時、クラス名の続きの()内に通常のメソッドと同様に引数を記述します。もし、5行目で引数を記述しなければエラーとなります。このように、コンストラクタを使うとデータの渡し忘れを防ぐことができます。
次回は、クラスの変わった使い方として、staticと定数を扱います。
Copyright © ITmedia, Inc. All Rights Reserved.