[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