PHP 7.2リリース&PHPのアクセス修飾子、アクセサメソッド、カプセル化、コンストラクタWeb業界で働くためのPHP入門(14)(3/3 ページ)

» 2018年02月08日 05時00分 公開
前のページへ 1|2|3       

カプセル化とコンストラクタ

カプセル化

 リスト3のように、「プロパティをprivateとして外部からアクセスできないようにして、それにアクセスするためのアクセサメソッドを必要に応じて用意する」ことを「カプセル化」と言います。これは、ちょうどインスタンス内の変数部分がカプセルのように包み込まれていることに起因する用語です。カプセル化は、オブジェクト指向構の大きな特徴の1つです。

カプセル化したTestScore

 ここで少し話を戻して、リスト1のTestScoreの例に戻ります。まずは、ここまでの解説を踏まえて、TestScoreAdvクラスをカプセル化したリスト5のTestScoreCapsuleを考えます。

<?php
class TestScoreCapsule
{
    private $name = "";
    private $math = 0;
    private $english = 0;
    private $japanese = 0;
 
    〜省略〜
}
リスト5 phplesson/chap14/TestScoreCapsule.php

 4〜7行目のプロパティ部分のアクセス修飾子をprivateにしただけです。そのため、その他のメソッドやアクセサメソッドは省略しています。このTestScoreCapsuleを利用するuseTestScoreCapsule.phpはリスト6のようになります。

<?php
require_once("TestScoreCapsule.php");
 
$taro = new TestScoreCapsule();
$taro->setData("たろう", 87, 92, 74);
$taro->printScore();
リスト6 phplesson/chap14/useTestScoreCapsule.php

 実行結果は下記の通りです。

たろうさんの合計: 253 平均: 84.333333333333
リスト6の実行結果

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;
    }
 
    〜省略〜
}
リスト7 phplesson/chap14/TestScoreConstructor.php

 リスト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();
リスト8 phplesson/chap14/useTestScoreConstructor.php

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

 5行目がコンストラクタの呼び出しです。new時、クラス名の続きの()内に通常のメソッドと同様に引数を記述します。もし、5行目で引数を記述しなければエラーとなります。このように、コンストラクタを使うとデータの渡し忘れを防ぐことができます。

次回はクラスの変わった使い方

 次回は、クラスの変わった使い方として、staticと定数を扱います。

今回のサンプルコード

 今回のサンプルコードはこちらからダウンロードできます。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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