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

コンストラクタ

void __construct ( [mixed args [, ...]] )

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

注意: 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが 暗黙の内にコールされることはありません。 親クラスのコンストラクタを実行するには、子クラスのコンストラクタの 中で parent::__construct() をコールすることが 必要です。

例 19-7. 新しい統一されたコンストラクタを使用する

<?php
class BaseClass {
   function
__construct() {
       print
"In BaseClass constructor\n";
   }
}

class
SubClass extends BaseClass {
   function
__construct() {
       
parent::__construct();
       print
"In SubClass constructor\n";
   }
}

$obj = new BaseClass();
$obj = new SubClass();
?>

下位互換性を維持するため、PHP 5 が指定されたクラスの __construct() 関数をみつけられない場合には、 古い形式のコンストラクタ関数、つまり、そのクラスの名前と同じ関数が探されます。 実際、互換性の問題が発生する可能性があるのは、 そのクラスが __construct() という名前のメソッドを 有しており、それが異なる用途で使用されている場合です。

デストラクタ

void __destruct ( void )

PHP 5 では、C++ のような他のオブジェクト指向言語に似た概念のデストラクタが 導入されました。デストラクタメソッドは、特定のオブジェクトへの全てのリファレンスが 削除された直後やオブジェクトが明示的に破棄された直後にコールされます。

例 19-8. デストラクタの例

<?php
class MyDestructableClass {
   function
__construct() {
       print
"In constructor\n";
       
$this->name = "MyDestructableClass";
   }

   function
__destruct() {
       print
"Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
?>

コンストラクタと同様、親クラスのデストラクタがエンジンにより暗黙のうちに コールされるということはありません。親クラスのデストラクタを実行するには、 デストラクタの中で明示的に parent::__destruct() をコールする必要があります。

注意: デストラクタはスクリプトがシャットダウンしている間にコールされますので、 ヘッダは常に送信済みになります。

注意: デストラクタの中から例外をスローしようとすると、致命的なエラーを 引き起こします。