PHP 7.2リリース&PHPのアクセス修飾子、アクセサメソッド、カプセル化、コンストラクタ:Web業界で働くためのPHP入門(14)(3/3 ページ)
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。前回からPHPの「オブジェクト指向言語」としての書き方を紹介しています。今回は、PHPのアクセス修飾子、アクセサメソッド、カプセル化、コンストラクタなどについて。
カプセル化とコンストラクタ
カプセル化
リスト3のように、「プロパティをprivateとして外部からアクセスできないようにして、それにアクセスするためのアクセサメソッドを必要に応じて用意する」ことを「カプセル化」と言います。これは、ちょうどインスタンス内の変数部分がカプセルのように包み込まれていることに起因する用語です。カプセル化は、オブジェクト指向構の大きな特徴の1つです。
カプセル化したTestScore
ここで少し話を戻して、リスト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
setData()の危うさ
リスト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.
関連記事
- WordPress活用に欠かせない、PHPをWindowsにダウンロードしてインストール、アンインストールする
本連載では、さまざまなソフトウェアのインストール、実行するためのセットアップ設定、実行確認、アンインストールの手順を解説する。今回は、PHPとは何か、PHPで動くツールの紹介、PHPのインストールとアンインストールについて解説。PHPプログラミングを始める参考にしてほしい。 - PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ
「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。初回は、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスについて紹介します。 - PHP(スクリプト言語)
PHPは、HTMLへの埋め込みが可能なスクリプト言語(およびその処理系)。主としてWebアプリ開発に使用される。