各位前辈好,我之前写了一个 log 工具,父类为 LogTool,子类为 BizLogTool,其中LogTool里有一段代码是这样子的,是用来获取记录日志的文件名和代码行的:
$trace = debug_backtrace();
foreach ($trace as $callerinfo) {
if ($callerinfo['function'] == $method) {
return array('file'=>$callerinfo['file'], 'line'=>$callerinfo['line']);
}
}
记录日志时代码通常是这样的:
BizLogTool::debug('日志内容');
所以最上面代码里的 $method 通常就是 debug、warning、error 这些函数名。这段代码在 php 5.6 下面一直是工作正常的,调试时可以看到堆栈信息为:
查看 debug_backtrace() 获取到的堆栈信息也是正常的:
可以看到,这里总共获取到了18层堆栈信息;
可是当我把php切换到 7.0.10 之后,同样的代码,同样的参数再进行调试,则成了这样子的了:
如图红框所示,调用debug的类已经不是子类的名字了,而是变成了父类的名字了;
调用 debug_backtrace() 获取到的堆栈信息也不完整了:
如图红框所示,只有15层了,而且可以看到第1号元素和第2号元素之间,明显少了一个 function = "debug" 的元素。
综上所述,我的日志工具现在就无法正常工作了,没办法准确的记录日志被记下的代码位置了。
我查询了 php7 的新特性介绍,里面只提到一句“同样的限制也会影响到 debug_backtrace() 及其它检查函数参数的函数”,但是却没有提到任何解决方案。
还恳请前辈们指教,万分感激!