コンストラクタ

コンストラクタとは

コンストラクタ」はメソッドの一種ですが、普通のメソッドとは異なる特徴を持ちます。
それは、「インスタンスの生成時に自動的に実行される」という事です。

通常のメソッドは明示的に呼び出す事で実行しますが、コンストラクタは「new」の瞬間に実行されます。

まずはコンストラクタの定義の仕方を見てみます。

コンストラクタの定義

<?php

class Product
{
    public function __construct()
    {

    }
}

?>

メソッド名を「__construct()」とするだけです。
そしてコンストラクタのアクセス修飾子は基本的には必ず「public」にします。
この理由は後述します。

コンストラクタはどういう役目を果たすのでしょうか。
下の例を見てください。

<?php

class Product
{
    private $name; // 商品名
    private $productDate; // 製造日

    // コンストラクタ
    public function __construct($name, $productDate)
    {
        $this->name= $name;
        $this->productDate = $productDate;
    }

    // 商品名を取得
    public function getName()
    {
        return $this->name;
    }    

    // 製造日を取得
    public function getProductDate()
    {
        return $this->productDate;
    }    
}


?>

Productクラスに製造日をあらわす$productDateというフィールドを持たせました。

この$productDateを設定する方法はどうすべきでしょうか。
例えば$productDateの値を設定するためにpublicなsetProductDateなんてメソッドを作ってしまったら、いつでも自由に変更できてしまう事になります。製造日は商品にとって生まれた時点で決まり、一生変わる事はありません。

この事実をクラスのつくりで表現するには、オブジェクトの外側よりの変更を一切出来なくしなければならないので、フィールドはprivateにし、設定用のメソッドも設けない事にします。かといってフィールドの宣言で「private $productDate = '20090101'」とかやってしまったら全ての商品が同じ製造日になってしまいます。というか、製造もしないうちから設計図に、この車の製造日は2009/1/1ですって書いてあるようなものです。そんなことありえません。

そこでコンストラクタです。
コンストラクタはインスタンスの生成時に実行されるメソッドですので、言って見れば誕生の瞬間にただ一度だけ実行されるメソッドということになります。

そしてコンストラクタも通常のメソッドと同様、引数を要求できるので、コンストラクタの引数として製造日を渡し、コンストラクタの中でフィ-ルドにそれを格納すれば、絶対に変更が出来ず、かつインスタンスごとに違った値が保持できる事になります。
工場での製造工程で製造年月日の刻印をするようなものです。
コンストラクタは製造工程で行うべきことが書かれているとかんがえるとわかりやすいでしょうか。

実際にやってみましょう。

<?php

$kamaboko = new Product('かまぼこ', '2009/01/01');
$chikuwa = new Product('ちくわ', '2009/01/02');

$kamabokoName = $kamaboko->getName();
$kamabokoDate = $kamaboko->getProductDate();

$chikuwaName = $chikuwa->getName();
$chikuwaDate = $chikuwa->getProductDate();

print $kamabokoName . 'は' . $kamabokoDate . 'に製造されました。';
print $chikuwaName . 'は' . $chikuwaDate . 'に製造されました。';

?>
かまぼこは2009/01/01に製造されました。
ちくわは2009/01/02に製造されました。

インスタンス生成の時のクラス名の後の括弧「()」内に引数を記述します。普通のメソッドと同じような感じです。

「new クラス名()」はインスタンス生成と同時にコンストラクタの呼び出しもかねているのです。
最初にコンストラクタは必ずpublicにと言いましたが、ここに理由があります。
privateにしてしまうとメソッドが呼び出せないということになり、コンストラクタをprivateにしてしまうとインスタンスの生成が出来ないということになってしまいます。
実はこのことを利用した技もあるんですが、普通はやりません。
基本、コンストラクタはpublicと覚えてください。

コンストラクタはインスタンスの初期設定などに利用されます。