カスタム エラー ハンドラに関連する Stackoverflow について、すでに多くの質問があることは承知しています。しかし、それらの多くと PHP のマニュアルを読んでも、まだ問題を解決できません。したがって、私はこの質問を投稿しています。
私のスクリプトは現在、次のように構成されています。
require 'file.php';
require 'anotherFile.php';
// several more "require" here. These files contain many functions
function myErrorHandler($errno, $errstr, $errfile, $errline, $errcontext){
// some code to handle errors here
}
class myObject {
function __construct() {
// set the values here
}
function computeSomething() {
...
doFunction2();
...
}
function SomethingBadHappened()
{
}
}
function doFunction1() {
// for some reason, an error happens here
// it is properly handled by the current error handler
}
function doFunction2() {
// for some reason, an error happens here
// since it got called by $obj, I want the error handler to run $obj->SomethingBadHappened();
// but $obj is not known in myErrorHandler function!
}
set_error_handler('myErrorHandler');
// some procedural code here
doFunction1();
doAnotherThing();
// then I use objects
$obj = new myObject();
$obj->run();
// then I may use procedural code again
doSomethingElse();
カスタム エラー ハンドラーは既に正常に動作しています。エラーハンドラーが設定された後に実行されるコードで発生するすべての PHP エラーをキャッチして処理します。
私の問題:
クラスのメソッド内でエラーが発生した場合myObject
、非静的メソッドを呼び出したい:
$obj->SomethingBadHappened();
$obj
の範囲外ですmyErrorHandler
。$obj
エラーハンドラー内にアクセスしてメンバー関数を呼び出すにはどうすればよい$obj
ですか?
現在、300KB の PHP コードがあり、すべての関数の署名を変更し$obj
てパラメーターとして追加することはできません (関数が多すぎます!)。
カスタムエラーハンドラーをオブジェクトのメソッドとして定義できることを読みました。myObject
しかし、そうすると、 ($obj)のインスタンスを作成する前に発生したエラーをキャッチできなくなります。
例外についても読みましたが、問題の解決には役立たないようです。グローバル変数を使用したくありません。グローバル変数を避けるべき理由を説明する 2 つの質問を以下に示します。