|
趣味と実益と現実逃避で更新されるblogです.
役に立つことから無意味なことまでさまざま書いていきます.
|
| January 17th, 2007 |
PHP 4とregister_shutdown_function()に気をつけろ!!(Read: 2930) |
参照: 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) { // デバッグモードのときだけの処理 : : : } } } で,テストコードを書いてみた(実際はワンライナーで書いた). <?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 ちなみに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(); } |
| ELF Jan 17th, 2007 15:23 / [ 編集 ]
[ コメントする ] [ トラックバック(0) ] [ ] |
| The $5 Script Archive The best of PHP, MySQL, Flash and XML technologies, brought together at one low price. |
[ POST ] [ AddLink ] [ CtlPanel ]
| << | 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 | * | * | * | * | * | * |