我知道 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) 的实例之前发生的错误。
我还阅读了有关异常的信息,但这似乎无助于解决我的问题。我不愿意使用全局变量。这里有两个问题解释了为什么应该避免使用全局变量: