コンストラクター ¶
void__construct ([mixed$args [, $... ]] )
PHP 5 では、開発者がクラス内のコンストラクターとしてメソッドを定義できます。コンストラクターを持つクラスは、新しいオブジェクトが作成されるたびにこのメソッドを呼び出すため、オブジェクトを使用する前に初期化作業を行うのに非常に適しています。
注: コンストラクターがサブクラスで定義されている場合、その親クラスのコンストラクターは暗黙的に呼び出されません。親クラスのコンストラクターを実行するには、子クラスのコンストラクターでparent::__construct()を呼び出す必要があります。サブクラスでコンストラクターが定義されていない場合、通常のクラス メソッドと同様に親クラスから継承されます (プライベートとして定義されていない場合)。
例 #1 新しい標準コンストラクターの使用
class BaseClass { function __construct(){ print "In BaseClass constructor<br>"; } } class SubClass extends BaseClass { function __construct(){ parent::__construct(); print "In SubClass constructor<br>"; } } class OtherSubClass extends BaseClass {} $obj = new BaseClass(); $obj = new SubClass(); $obj = new OtherSubClass();
出力結果:
BaseClass コンストラクター内
BaseClass コンストラクター内
SubClass コンストラクター内
BaseClass コンストラクター内
下位互換性のため、PHP 5 の場合 __construct() の場合関数がクラス内に見つからず、親クラスから関数を継承していない場合は、古いスタイルのコンストラクター、つまりクラスと同じ名前の関数を検索しようとします。したがって、互換性の問題が発生する唯一の状況は、クラスに __construct() という名前のメソッドがすでに存在するが、それが他の目的に使用されている場合です。
他のメソッドとは異なり、親クラス __construct() とは異なるパラメーターを持つメソッドによって __construct() がオーバーライドされる場合、PHP は E_STRICT エラー メッセージを生成しません。
PHP 5.3.3 以降、名前空間では、クラス名と同じ名前のメソッドはコンストラクターとして使用されなくなりました。この変更は、名前空間にないクラスには影響しません。
例 #2 名前空間クラスのコンストラクター
namespace Foo; class Bar{ public function Bar(){ //在PHP5.3.0-5.3.2中被看作是构造函数 //自PHP5.3.3起被视作一个普通的方法 } }
Destructor ¶
void__destruct ( void )
PHP 5 では、C++ などの他のオブジェクト指向言語と同様のデストラクターの概念が導入されました。デストラクターは、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されるときに実行されます。
例 #3 デストラクターの例
<?php class MyDestructableClass{ function __construct(){ print "In constructor<br>"; $this->name = "MyDestructableClass"; } function __destruct(){ print "Destroying ".$this->name.'<br>'; } } $obj = new MyDestructableClass(); ?>
出力結果:
コンストラクター内
MyDestructableClass の破棄
コンストラクターと同様に、親クラスのデストラクターはエンジンによって秘密裏に呼び出されません。親クラスのデストラクターを実行するには、parent::__destruct() を子クラスのデストラクター本体で明示的に呼び出す必要があります。さらに、コンストラクターと同様に、サブクラスは、デストラクターが定義されていない場合、親クラスを継承します。
exit() を使用してスクリプトを終了する場合でも、デストラクターが呼び出されます。デストラクターで exit() を呼び出すと、残りのシャットダウン操作が中止されます。
注:
デストラクターは、スクリプトが閉じられたとき、つまりすべての HTTP ヘッダーが送信されたときに呼び出されます。スクリプトを閉じたときの作業ディレクトリは、SAPI (Apache など) 内にあるときとは異なる可能性があります。
注:
デストラクター (スクリプトの終了時に呼び出される) で例外をスローしようとすると、致命的なエラーが発生します。