[PHP-users 19796]set_error_handlerにオブジェクトのメソッドを定義するときについて

k.watanabe k.watanabe @ spclink.com
2004年 1月 9日 (金) 09:49:58 JST


k-wataと申します。

set_error_handlerについて質問です。

PHP 4.3.0以降のset_error_handlerでは、
オブジェクトへのリファレンスとメソッド名を含む配列を指定できると
マニュアルに書いてありましたので、
以下のようなコードを書いてみました。

<?php
error_reporting( E_ALL );

class Error
{
  var $errStr;

  function Error() {
    set_error_handler( array( &$this, 'errorHandler' ) );
    $this->errStr = '';
  }

  // エラーハンドラメソッド
  function errorHandler( $errno, $errstr ) {
    echo "errNo = "  . $errno  . "<br>";
    echo "errNo = "  . $errstr . "<br>";
    echo "result = " . $this->errStr;
    exit;
  }

  function set( $value ) {
    $this->errStr = $value;
  }

  function get() {
    return $this->errStr;
  }
}

$error = new Error();
$error->set( 'hogehoge' );
echo "check1 = " . $error->get() . "<br>";

// ここでNoticeエラーを起こす
if ($i == 0) {}

// 実際には表示されない
echo "正常";

?>

-- 表示結果 ----

check1 = hogehoge
errNo = 8
errNo = Undefined variable: i
result =

----------------


オブジェクトをnewして、インスタンスを作成し、
コンストラクタで、このオブジェクト内のメソッドに対して
エラーハンドラーを設定しています。

作成されたオブジェクトに、setメソッドにてプロパティをセットし
getメソッドにて表示させるところまでは、意図したとおりに動作しています。
(check1)

しかし、エラーを起こして、エラーハンドラ内で
先ほどセットしたプロパティを表示しようとすると表示されません。(result)

エラーハンドラの定義では、オブジェクトを参照で渡しているので
newしたインスタンスの参照が使われると思っていたのですが、
エラーハンドラで定義したオブジェクトと、実際にnewしたときのオブジェクトは、
別のオブジェクトということなのでしょうか?

考え方自体が間違っているのでしょうか?

ご教授いただけたら幸いです。
よろしく願いします。


Apache 2.0.48
PHP 4.3.4

--
k.watanabe



PHP-users メーリングリストの案内