php4でのデストラクタの整理
忘れないように整理しておく。
間違っていたら誰か指摘してくれるとありがたいです。。
php4にはデストラクタは存在しない
しかしregister_shutdown_functionを使ってデストラクタ的なもの(以降なんちゃってデストラクタと呼ぶ)を定義することはできる。
一番簡単なのは
PEARクラスを継承すること。
そうすれば、_クラス名(アンダーバー+クラス名)のメソッドを定義することでそれが自動的になんちゃってデストラクタになる。
(ここらへんの実装はソースを見ると面白いかもしれない)
それくらいでわざわざPEAR継承したくないよ!とか
PEARを使わない方針の場合は自分でコンストラクタの中でregister_shutdown_functionを使ってやればよい。
↓こんな感じで。
hoge.class.php
fuga.class.php
どちらの場合(PEARも自前)もregister_shutdown_functionを使っているので、
このなんちゃってデストラクタが呼び出されるタイミングはあくまでスクリプト終了時。
こんな感じのソースで
実行すると・・・
スコープから抜けてオブジェクトが参照されなくなってもなんちゃってデストラクタが呼ばれてないことがわかる。
本来のデストラクタならインスタンスの開放時に呼ばれるべき。
これがなんちゃってデストラクタとか言われる所以。らしい。
結局のところ非持続的なresource型の開放(mysql_closeなど)が目的ならばphpでは自動的に開放されるのでわざわざなんちゃってデストラクタを定義して開放する必要性はあまりない。
(phpが自動的にresourceを開放するのがスクリプト終了時、なんちゃってデストラクタが呼ばれるのもスクリプト終了時なので明示的に書く意味がない。)
よってなんちゃってデストラクタを作ること自体php4ではあまりないのかもしれない。
少なくとも先に述べたようにresource型を開放するだけのために作るのは意味がない。はず。
参考:
付録 L. リソース型の一覧
間違っていたら誰か指摘してくれるとありがたいです。。
php4にはデストラクタは存在しない
しかしregister_shutdown_functionを使ってデストラクタ的なもの(以降なんちゃってデストラクタと呼ぶ)を定義することはできる。
一番簡単なのは
PEARクラスを継承すること。
そうすれば、_クラス名(アンダーバー+クラス名)のメソッドを定義することでそれが自動的になんちゃってデストラクタになる。
(ここらへんの実装はソースを見ると面白いかもしれない)
それくらいでわざわざPEAR継承したくないよ!とか
PEARを使わない方針の場合は自分でコンストラクタの中でregister_shutdown_functionを使ってやればよい。
↓こんな感じで。
hoge.class.php
fuga.class.php
どちらの場合(PEARも自前)もregister_shutdown_functionを使っているので、
このなんちゃってデストラクタが呼び出されるタイミングはあくまでスクリプト終了時。
こんな感じのソースで
実行すると・・・
スコープから抜けてオブジェクトが参照されなくなってもなんちゃってデストラクタが呼ばれてないことがわかる。
本来のデストラクタならインスタンスの開放時に呼ばれるべき。
これがなんちゃってデストラクタとか言われる所以。らしい。
結局のところ非持続的なresource型の開放(mysql_closeなど)が目的ならばphpでは自動的に開放されるのでわざわざなんちゃってデストラクタを定義して開放する必要性はあまりない。
(phpが自動的にresourceを開放するのがスクリプト終了時、なんちゃってデストラクタが呼ばれるのもスクリプト終了時なので明示的に書く意味がない。)
よってなんちゃってデストラクタを作ること自体php4ではあまりないのかもしれない。
少なくとも先に述べたようにresource型を開放するだけのために作るのは意味がない。はず。
参考:
付録 L. リソース型の一覧