PHP - OOP - 6. コンストラクタ

これまでに学習してきたようにクラスにはプロパティやメソッドを記述します。メソッドには、コンストラクタと呼ばれる特殊なメソッドが存在します。

コンストラクタの記述

コンストラクタは、クラスからインスタンスを生成するときに呼び出される特殊なメソッドです。コンストラクタメソッドと呼ぶこともあります。PHPでコンストラクタを実装するには __construct という名前でメソッドを定義します。

ここでは以前に作成している MyClass.php ファイルにコンストラクタを追加してみましょう。

<?php
class MyClass
{
    public $myProperty;

    public function __construct($value)
    {
        $this->myProperty = $value;
    }

    public function myMethod($x)
    {
        echo $this->myProperty . " " . $x;
    }
}

コンストラクタの主な用途は、インスタンス生成時のプロパティの初期化です。ここでいう初期化とはプロパティに初期値を代入という意味です。このプログラムではコンストラクタの引数で受け取った $value の値を使って $myProperty プロパティを初期化しています。

定義したコンストラクタは new 演算子によってクラスからインスタンスを生成する際に呼び出されます。メソッドのように名前で呼び出すのではない点に注意してください。それでは実際にコンストラクタを呼び出す様子を見てみましょう。my_class_runner.php ファイルを次のように修正します。

<?php
require_once("MyClass.php");

$myClass = new MyClass("Hello"); # コンストラクタ呼び出し
$myClass->myMethod("Andy"); #=> Hello Andy

MyClass クラスに定義したコンストラクタは、引数を1つ受け取る( $value )ようにしているので、上記のように引数に "Hello" を指定してインスタンスを生成できます。この結果、 MyClass インスタンスの $myProperty プロパティは "Hello" で初期化されるため、 $myClass->myMethod("Andy") を実行すると画面に Hello Andy と出力されます。

繰り返しになりますが new MyClass("Hello") はコンストラクタ( __construct メソッド)を呼び出しています。

PHPプログラムの開発(コンストラクタの実装)

それでは簡単な計算機クラス( SimpleCalc )にコンストラクタを追加してみましょう。

<?php
class SimpleCalc
{
    private $number;

    public function __construct($number)
    {
        $this->number = $number;
    }

    public function setNumber($number)
    {
        $this->number = $number;
    }

    public function getNumber()
    {
        return $this->number;
    }

    public function add($x)
    {
        $this->number = $this->number + $x;
    }

    public function show()
    {
        echo $this->number . PHP_EOL;
    }
}

ここでは計算機クラスに引数$numberを受け取るコンストラクタを実装しています。

    public function __construct($number)
    {
        $this->number = $number;
    }

コンストラクタでは引数( $number ) で受け取った値を $number プロパティに代入しています。このようにコンストラクタはプロパティを初期値を代入するために利用します。

続いて実行プログラム( calc_runner.php )を修正します。

<?php
require_once("SimpleCalc.php");

$calc = new SimpleCalc(10);

// $calc->setNumber(10);

$calc->add(20);
$calc->add(30);
$calc->show();

ここでは new 演算子によって SimpleCalc クラスのコンストラクタを呼び出しています。この時、コンストラクタの引数に 10 を指定しているので SimpleCalc インスタンスの $number プロパティに 10 が代入されます。

それではターミナルからプログラムを実行してみましょう。

$ php calc_runner.php
60

実行結果からコンストラクタによって SimpleCalc インスタンスの $number プロパティを適切に初期化できているのがわかります。このようにコンストラクタはインスタンス生成時にプロパティを初期化するために使う特殊なメソッドです。

コンストラクタを定義することでインスタンス生成時に期待する値でプロパティを初期化できます。

コンストラクタのデフォルト引数について

PHPのコンストラクタやメソッド(関数)には引数を省略された場合のデフォルト値を定義できます。ここでは簡単な計算機クラス( SimpleCalc )にコンストラクタ引数にデフォルト値を定義してみましょう。

<?php
class SimpleCalc
{
    private $number;

    public function __construct($number = 0)
    {
        $this->number = $number;
    }
    // ...省略
}

上記のように引数の初期値を決定しておくことで、呼び出し元プログラム(calc_runner.php)でコンストラクタの呼び出しを工夫できます。

<?php
require_once("SimpleCalc.php");

$calc = new SimpleCalc(10);
$calc2 = new SimpleCalc();

// $calc->setNumber(10);

$calc->add(20);
$calc->add(30);
$calc->show();

$calc2->add(100);
$calc2->show();

ここでは SimpleCalc 型のインスタンスを2つ生成しています。

$calc = new SimpleCalc(10);
$calc2 = new SimpleCalc();

このとき1つ目のインスタンス生成時にはコンストラクタ引数に 10 を渡していますが、2つ目のインスタンス生成時には引数を省略しています。このときコンストラクタの引数はデフォルト値である 0 が利用されます。

それではターミナルからプログラムを実行してみましょう。

$ php calc_runner.php
60
100

実行結果から2通りのコンストラクタ呼び出しが正しく機能しているのがわかります。このようにコンストラクタやメソッドの引数にデフォルト値を指定しておくことで、呼び出し元のプログラムで不要な場合は引数の指定を省略できます。

参考:マジックメソッド

PHPには __construct のように、 __ で始まる特別なメソッドがいくつか用意されています。このような特殊なメソッドはマジックメソッドと呼びます。詳しくは PHPマニュアル - マジックメソッド を参照してください。

まとめ

  • コンストラクタとは、クラスからインスタンスを生成するときに呼び出される処理のこと
  • コンストラクタはインスタンス生成時のプロパティの初期化に利用する
  • new 演算子によってクラスに定義した __construct メソッド(コンストラクタ)が呼び出される