投稿者 |
メッセージ |
|
< PHPプログラミング ~ php4でのデストラクタについて |
|
時間:
火 2月 21, 2006 8:30 pm
|
|
|
|
php4ではデストラクタがサポートされてないみたいなので自作してみたんですが
以下の例はちゃんとオブジェクトは削除されているんでしょうか?
phpのバージョンは、4.4.2です。
/************** destruct.php **************/
$stack = array(); // オブジェクトのリファレンスを格納
$num = 0; // 格納数
register_shutdown_function(destruct_func);
function destruct_func() // シャットダウン時のコールバック登録
{
global $stack; global $num;
for($i=0; $i<$num; $i++ ) {
if($stack[$i]) {
$destruct = '_' . get_class($stack[$i]);
$stack[$i]->$destruct();
$stack[$i] = null;
}
}
}
class destruct { // デストラクタクラス
function destruct() {
global $stack; global $num;
$stack[$num++] =& $this;
}
}
/************** test.php **************/
include_once 'destruct.php';
class test extends destruct {
var $val; // チェック数
// コンストラクタ
function test() { $this->destruct(); $this->val = 100; }
// デストラクタ
function _test() { $this->show(); echo '破棄された。'; }
function show() { echo 'val = ' . ++$this->val . '<br>'; }
}
$c = new test();
$c->show();
$c->show();
/************** 出力結果 **************/
val = 101
val = 102
val = 101
破棄された。
となって、ちゃんと動いてないっぽいので
$c = new test();
の部分を
$c =& new test();
こう変更すると
/************** 出力結果 **************/
val = 101
val = 102
val = 103
破棄された。
となって、ちゃんと動いてる風味なんですけど、
これはちゃんとデストラクタを実装できてると言っていんでしょうか?
あと、 = new が値渡しで、 =& new が参照渡しと考えていいのでしょうか? |
|
|
|
|
|
|
|
時間:
水 2月 22, 2006 10:16 am
|
|
|
|
|
|
|
|
|
|
新規投稿: 不可 返信: 不可t 自分の記事の編集: 不可 自分の記事の削除: 不可 投票への参加: 不可
|
|