【PHP】コンストラクタ - オブジェクトの初期化メソッド

【PHP】コンストラクタ - オブジェクトの初期化メソッド

オブジェクトの生成時にはコンストラクタと呼ぶメソッドが呼び出されます。

コンストラクタを使ってオブジェクトを初期化することが可能です。

ここでは、コンストラクタについて解説します。

検証環境

コンストラクタ

コンストラクタは“オブジェクト生成時に呼び出されるメソッド”です。

newキーワードでクラスからオブジェクトを生成する時に呼び出されます。

一般的に引数を使って、フィールド等のオブジェクトの初期化に使います。

コンストラクタの定義

コンストラクタをクラス定義の中に記述することで、任意の処理を行うことができます。

基本構文

class クラス名 {
    アクセス修飾子 function __construct( 仮引数1, 仮引数2 ... ) {
        処理
    }
}

コンストラクタの構文は通常のメソッドと同じですが、メソッド名を__constructにします。

また、引数は任意の数だけ記述できますが、戻り値は記述しません。

サンプル

<?php

// 人間クラス
class Person {
    
    // 苗字
    public $l_name;
    // 名前
    public $f_name;
    
    // コンストラクタ
    ___ih_hl_start
    public function __construct( $l_n, $f_n ) {
        $this->l_name = $l_n;
        $this->f_name = $f_n;
    }
    ___ih_hl_end
    
}

?>
$ php sample.php
$

12〜15行目がコンストラクタです。

引数$l_n$f_nの値をフィールド$l_name$f_nameに代入し、初期化しています。

コンストラクタはオブジェクトの生成時に呼び出されるため、定義のみでは実行されません。

オブジェクトの生成

コンストラクタはオブジェクトの生成時に呼び出されます。

基本構文

new クラス名(実引数1, 実引数2 ...)

引数がある場合は、クラス名の後の丸括弧(())内に実引数を記述します。

サンプル

<?php

// 人間クラス
class Person {
    
    // 苗字
    public $l_name;
    // 名前
    public $f_name;
    
    // コンストラクタ
    public function __construct( $l_n, $f_n ) {
        $this->l_name = $l_n;
        $this->f_name = $f_n;
    }
    
}

___ih_hl_start
$person = new Person('TANAKA', 'TARO');
___ih_hl_end

var_dump($person);

?>
$ php sample.php
object(Person)#1 (2) {
  ["l_name"]=>
  string(6) "TANAKA"
  ["f_name"]=>
  string(4) "TARO"
}

19行目でオブジェクトを生成しています。

コンストラクタに渡す実引数を丸括弧内に記述しており、var_dump関数の出力結果から各フィールドが初期化できていることが分かります。

演習問題

問題1

次の実行結果になる車クラスを扱うプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 車クラスを作成する
  • 車クラスのフィールドはナンバー、色、乗車人数とする
  • 車クラスのインスタンスの初期値はコンストラクタで設定する
  • 車情報を出力するinfoメソッドを作成する
===== 車情報 =====
ナンバー : 1234
色    : 紺色
乗車人数 : 5人
===== 車情報 =====
ナンバー : 0987
色    : 赤
乗車人数 : 2人

問題2

次の実行結果になる家クラスを扱うプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 家クラスを作成する
  • 家クラスのフィールドは階数、間取り、完成日とする
  • 家クラスのインスタンスの初期値はコンストラクタで設定する
  • 家情報を出力するinfoメソッドを作成する
===== 家情報 =====
階数  : 1階
間取り : 3LDK
完成日 : 2022/01/25
===== 家情報 =====
階数  : 3階
間取り : 10LDK
完成日 : 2020/03/24
===== 家情報 =====
階数  : 2階
間取り : 5LDK
完成日 : 2021/08/01