为什么PHP提供未定义的索引但仍返回该索引的数据?

时间:2016-06-22 17:07:38

标签: php

我在记录功能中有这个

$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>

这怎么可能发生?

1 个答案:

答案 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(或朋友),您将无法使用它。