2016-06-22 7 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インデックスがあるということです。

私は、while条件で

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(または友人)を経由している場合、あなたはそれを持っていないためです。

関連する問題