MyMiniCity踏んでください!!

ただいま絶賛MyMiniCity参加中です.是非リンクを踏んでください!!(笑
January 17th, 2007

PHP 4とregister_shutdown_function()に気をつけろ!!

(Read: 2930)
Add to Hatena Bookmark Add to livedor clip! Buzzurlにブックマーク Add to del.icio.us このページを行き先登録 Add to drecom Add to MM/Memo Add to FC2 Bookmark Yahoo!ブックマークに登録

参照: PHP: register_shutdown_function - Manual
register_shutdown_function()はマニュアルを見てもらえばわかるのですが,PHPのスクリプト処理が終了した後に実行される関数(メソッド)を登録する関数です.
※指摘があり再確認したらregister_shutdown_functionは期待通りの動作をするようでした…(涙
PHP 4(バージョン4.4.4)で構築しているある案件で

・常に最後に実行される処理を用意したい.
・デバッグモードのときだけプロファイルを表示するようにしたい

ってことでregister_shutdown_function()を何も考えずに使用した.
コアクラスのようなものを作成していたので,シャットダウンメソッドで上記を実装.
例えばこんな感じ.


class Core {
var $flag;

function Core() {
$this->enableFlag();
:
:
:
register_shutdown_function(array(&$this, 'shutdown'));
}

function enableFlag() {
$this->flag = false;
}

function disableFlag() {
$this->flag = false;
}

function shutdown() {
if ($this->_flag) {
// デバッグモードのときだけの処理
:
:
:
}
}
}
しかしどーも$this->_flagがいつまでたってもfalseにならない.
で,テストコードを書いてみた(実際はワンライナーで書いた).


<?php
class foo {
var $count = 0;
function foo() {
register_shutdown_function(array(&$this,"shutdown"));
}
function add() {
$this->count++;
}
function show() {
echo $this->count."\n";
}
function shutdown() {
$this->show();
}
}
$obj = &new foo;
$obj->show(); // 0が表示されるはず
$obj->add();
$obj->show(); // 1が表示されるはず
$obj->add();
$obj->show(); // 2が表示されるはず
$obj->add();

// 最後に3が表示されるはず
?>
とりあえず実行.


$ php -r 'class foo { var $count = 0; function foo() {register_shutdown_function(array(&$this,"show"));}function add(){$this->count++;} function show() { echo $this->count."\n";}} $obj = new foo;$obj->show();$obj->add();$obj->show();$obj->add();$obj->show();$obj->add();'
0
1
2
0
ガーン.register_shutdown_functionには参照でオブジェクトを渡せないのかも!!(PHPのソース見てないけど)

ちなみにPHPバージョン5.2.0ではOKでした.4949.


$ php -r 'class foo { var $count = 0; function foo() {register_shutdown_function(array(&$this,"show"));}function add(){$this->count++;} function show() { echo $this->count."\n";}} $obj = new foo;$obj->show();$obj->add();$obj->show();$obj->add();$obj->show();$obj->add();'
0
1
2
3
とりあえずこういうので逃げた.

クラスにインスタンス取得メソッドを追加

実装方法としてはグローバル変数が必要になるけど
とあるグローバル変数にインスタンスオブジェクトの参照を入れてそれを使いまわすことにする.


function &getInstance() {
$result = null;

if ($GLOBALS['foo']) {
$result = &$GLOBALS['foo'];
} else {
$result = &new foo();
}
return $result;

}

shutdown()でgetInstance()を使う

shutdown()内でさっきのgetInstance()を使う.これでOK.


function shutdown() {
$foo = foo::getInstance();
$foo->show();
}


▼ この記事へのコメント ▼
> $obj = &new foo;
でいけるような気がします。$objはregisterしたあとでコピーされてる、ってことで。

ごめんなさい
引用がミスってました.
実際には$obj = &new foo;でもテストしています(結果NG).

ってもう1回やったらOKだった.ぐは.

$ php -r 'class foo { var $count = 0; function foo() {register_shutdown_function(array(&$this,"show"));}function add(){$this->count++;} function show() { echo $this->count."\n";}} $obj = &new foo;$obj->show();$obj->add();$obj->show();$obj->add();$obj->show();$obj->add();'
0
1
2
3

トピックの参照元

▼最近のトピック

▼ 人気のトピック


< 過去の記事 [ 2月の All Categories リスト ] 新しい記事 >

執筆に関わりました>>



Powered by Alexa.
[プレスブログ]価値あるブログに掲載料をお支払いします。
The $5 Script Archive
The best of PHP, MySQL, Flash and XML technologies, brought together at one low price.
Powered by gsblog (customize)

[ POST ] [ AddLink ] [ CtlPanel ]

Subscribe blog

  • Bloglinesで登録
  • Subscribe with livedoor Reader
  • はてなで購読
  • Yahoo! RSSリーダーで購読
  • Add to Google

Bookmark blog

  • Add to Hatena Bookmark
    blog.poyo.jp の新着ブックマーク
  • Add to livedor clip!
  • Buzzurlにブックマーク
  • Add to FC2 Bookmark
  • Yahoo!ブックマークに登録

About me

応援しています

我が息子が産まれたアクア・バースハウス(東京都世田谷区にある助産院)を応援しています.

翻訳のお仕事

腕に自信がある方,修行をしたい方はこちらをどうぞ.

2010 calendar

2月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28
| Day | Month | Year |

Powered by RRDTOOL.

Archives

Categories

Links


Mail to admin
myblogへ行く blog Rankingへ行く RSS feed meter for http://blog.poyo.jp/ Search Engine Optimization blogoole pingサーバ
blogpeople.netに登録!!

Hatena Ring

スカウター : よくきたblog

My Google news

Related site

ころんころん♪ べびぽよ フォト蔵Wiki