2016-06-22 21 views
0

我有這樣的記錄功能爲什麼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']) 

避免這種錯誤,但它是邏輯冗餘 - file總是存在於$stack[0],我已經手動驗證了這一點。此外,如果我在循環內打印$stack[0]['file'](在shift之後),則它可以發出Undefined index警告,並且仍會打印該索引的數據。

這怎麼會發生?

+1

如果你的問題包含模擬數據來初始化'$ stack',這將有所幫助。 – Quentin

+0

你需要給我們一個[mcve] – Rizier123

+0

@arkascha括號內的空格是[完全可以接受的](https://3v4l.org/S510W)。 – bishop

回答

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(或朋友),你將不會擁有它。