我在记录功能中有这个
$e = new Exception ();
$stack = $e -> getTrace ();
$exclude = 'foo.php';
while (isset ($stack [0])
&& ($exclude === substr ($stack [0] ['file'], -strlen($exclude))
|| 'error_handler' === $stack [0] ['function']))
{
array_shift ($stack);
}
有时这会给出
Undefined index: file in bar.php on line 84
奇怪的是,如果我在任何时候打印出$stack[0]
的内容,那么该数组中就会有一个file
索引。
我可以通过添加
来避免此错误isset ($stack [0] ['file'])
在while条件下,但它在逻辑上是多余的 - file
总是出现在$stack[0]
中,我已经手动验证了这一点。此外,如果我在循环内打印$stack[0]['file']
(shift
之后),则它会发出Undefined index
警告,仍会打印该索引的数据。< / p>
这怎么可能发生?
答案 0 :(得分:1)
不幸的是,'file'
始终存在 :
function foo() {
var_dump((new \Exception)->getTrace()[0]);
}
call_user_func('foo', []);
输出:
array(2) {
["function"]=>
string(3) "foo"
["args"]=>
array(1) {
[0]=>
&array(0) {
}
}
}
有关于此的ancient bug报告,但不会修复。如果您正在使用'file'
,请为'file'
保护,因为如果跟踪流经call_user_func
(或朋友),您将无法使用它。