[PHP-users 11550] Re: クラス内でのエラー処理
WADA Masashi
php-users@php.gr.jp
Mon, 18 Nov 2002 19:45:06 +0900
和田です。
Eiji Miwa wrote:
> Notice: Array to string conversion in /xxx/xxx/xxx.inc on line xx
>
> ...と set_error_handler の行でエラーが出てしまいます。
>
> set_error_handler へのユーザ定義関数の指定方法が問題になるのですが、
> 配列ではなく、文字列でクラスの関数を指定する方法はあるのでしょうか?
> もしくは、クラスの関数を指定することは出来ないのでしょうか?
PHPマニュアルを見ると set_error_handler は
string set_error_handler ( string error_handler)
と定義されているので、
> $old_eh = set_error_handler( array( $this, "error_handler" ) );
のように配列は指定できないと思います。どうして配列が指定できると
思われたのでしょうか?
で、この部分を以下のように変更して試してみたら、一応動きました。
ミワさんが目指すものとは違うのでしょうが・・・。
class my_error_handler {
/* Error Handler */
- function error_handler( $errno, $errmsg, $filename, $linenum, $vars ) {
+ function error_handler($errno, $errstr, $errfile, $errline) {
エラー処理($errno, $errstr, $errfile, $errline)
}
/* Constructor */
function my_error_handler() {
error_reporting( E_ALL );
- $old_eh = set_error_handler( array( $this, "error_handler" ) );
+ $old_eh = set_error_handler("my_error_handler::error_handler");
}
}
ポイントは二つです。
まず、エラーハンドラの登録。
set_error_handler("my_error_handler::error_handler")
そして、エラーハンドラの定義。
function error_handler($errno, $errstr, $errfile, $errline)
ミワさんのスクリプトでは、エラーハンドラが
function error_handler( $errno, $errmsg, $filename, $linenum, $vars )
と定義されていますが、引数の数が4つになっていません。引数の数が
異なっていても、なぜか set_error_handler() は正常終了するようで
すが、trigger_error() 実行時に肝心のエラーハンドラーが呼び出され
ません。
しかし上記の回避方法では、エラーハンドラクラスのインスタンスを
生成しても、実際に実行されるエラーハンドラは 静的メソッドとして呼
び出されるので、あまり良い解決策ではないでしょう。
代案といっても、これといったものが思い浮かばないのですが・・・。
class Error_handler {
...
}
function my_error_handler($errno, $errstr, $errfile, $errline) {
$eh = new Error_handler();
...
}
set_error_handler("my_error_handler");
----
和田雅志 (WADA Masashi)
wada@hh.iij4u.or.jp