PHP
manual
読書会
constructor
destructor

PHP Manual 読書会(12回目)(クラスとオブジェクト4)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回:PHP Manual 読書会(11回目)(クラスとオブジェクト3)

コンストラクタとデストラクタ

コンストラクタ

PHP 5 では、開発者がクラスのコンストラクタメソッドを宣言することが できます。コンストラクタメソッドを有するクラスは、新たにオブジェクトが 生成される度にこのメソッドをコールします。これにより、 そのオブジェクトを使用する前に必要な初期化を行うことができます。

要注意な点としては、

注意: 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが 暗黙の内にコールされることはありません。 親クラスのコンストラクタを実行するには、子クラスのコンストラクタの 中で parent::__construct() をコールすることが 必要です。 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承します (ただし、private 宣言されている場合は除く)。 これは、通常のクラスメソッドと同様です。

ここですね。

<?php

class Base {
    function __construct() {
        echo "Yo!\n";
    }
}

class Sub extends Base {
}

$obj = new Sub();

結果

Yo!

これが、privateに指定された場合は

<?php

class Base {
    private function __construct() {
        echo "Yo!\n";
    }
}

class Sub extends Base {
}

$obj = new Sub();

エラーになります。

PHP Fatal error:  Uncaught Error: Call to private Base::__construct() from invalid context

親クラスのコンストラクタを呼びたい場合は、明示的に呼びます。

<?php

class Base {
    function __construct() {
        echo "Yo!\n";
    }
}

class Sub extends Base {
    function __construct() {
        parent::__construct();
        echo "Yo!\n";
    }
}

$obj = new Sub();
Yo!
Yo!

他のメソッドと異なり、親の __construct() と異なるパラメータで __construct() をオーバーライドしても PHP は E_STRICT エラーメッセージを出しません。
PHP 5.3.3 以降、名前空間つきのクラス名の最後の部分と同じ名前のメソッドは コンストラクタとみなされなくなりました。 名前空間を使っていないクラスは今までと変わりません。

他に注意すべき点は、この場合だとSubというメソッドを追加した場合5.3.3以前はコンストラクタとしてみなされていたが、現在のバージョンでは見なされない。

デストラクタ

PHP 5 では、C++ のような他のオブジェクト指向言語に似た概念のデストラクタが 導入されました。デストラクタメソッドは、 特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 あるいは、スクリプトの終了時にも順不同でコールされます。

<?php

class Base {
    function __destruct() {
        echo "Yo!\n";
    }
}

class Sub extends Base {
    function __destruct() {
        parent::__destruct();
        echo "Yo!\n";
    }
}

$obj = new Sub();
$obj = NULL;
echo "delete\n";

結果

Yo!
Yo!
delete

気にすべき点としては、

exit() でスクリプトの実行を止めた場合にもデストラクタはコールされます。 デストラクタの内部で exit() をコールすると、 それ以降のシャットダウンルーチンを実行しません。

このデストラクタ内部でexit()をコールすると、それ以降のシャットダウンルーチンが実行されない点。