folgenden Code Betrachten:
<?
class BtTest
{
public function getTheItem()
{
var_dump(debug_backtrace(false));
$bt = debug_backtrace(false);
return $bt[1];
}
public function __call($methodName, $methodArgs)
{
return $this->getTheItem();
}
}
$o = new BtTest();
$bti = $o->test();
assert('array_key_exists("function", $bti)');
assert('array_key_exists("line", $bti)');
assert('array_key_exists("file", $bti)');
Die Ausführung des obigen Beispiel erzeugt folgende Ausgabe:
array(3) {
[0]=>
array(6) {
["file"]=>
string(53) "/somewhere/in/the/filesystem/tests/bt-test-so.php"
["line"]=>
int(13)
["function"]=>
string(10) "getTheItem"
["class"]=>
string(6) "BtTest"
["type"]=>
string(2) "->"
["args"]=>
array(0) {
}
}
[1]=>
array(4) {
["function"]=>
string(6) "__call"
["class"]=>
string(6) "BtTest"
["type"]=>
string(2) "->"
["args"]=>
array(2) {
[0]=>
&string(4) "test"
[1]=>
&array(0) {
}
}
}
[2]=>
array(6) {
["file"]=>
string(53) "/somewhere/in/the/filesystem/tests/bt-test-so.php"
["line"]=>
int(18)
["function"]=>
string(4) "test"
["class"]=>
string(6) "BtTest"
["type"]=>
string(2) "->"
["args"]=>
array(0) {
}
}
}
PHP Warning: assert(): Assertion "array_key_exists("line", $bti)" failed in /somewhere/in/the/filesystem/tests/bt-test-so.php on line 21
PHP Warning: assert(): Assertion "array_key_exists("file", $bti)" failed in /somewhere/in/the/filesystem/tests/bt-test-so.php on line 22
Der erste Backtrace Element (Index 0) sagt indirekt (durch die line
und file
Artikel) dass die getTheItem
Methode von der __call
Methode aufgerufen wurde.
Der zweite Backtrace Artikel (Index 1) sagt, dass die __call
Methode von irgendwo genannt wurde (fehlende line
und file
Artikel).
Das dritte Backtrace-Element (Index 2) besagt, dass die test
-Methode aus dem globalen Bereich des Skripts aufgerufen wurde.
Die Stelle der __call
Methodenaufruf ist wahrscheinlich in einer Methode Auflösung Code irgendwo im PHP-Interpreter-Code. Es gibt zwei Möglichkeiten, es zu beheben. Entweder sollte das zweite Element die Quellcodedatei und die Zeile des Interpreters verweisen, oder das zweite und das dritte Backtrace-Element sollten zu einem zusammengeführt werden. Ich persönlich würde die zweite Lösung bevorzugen, da die Interna des Interpreters für mich nicht interessant sind (so scheinen sie es in Pythons Traceback zu tun), aber ich verstehe, dass manchmal die erste Lösung eine explizitere Spur liefert (besonders wenn es ein Callback ist) aus dem Inneren aufgerufen).
So oder so, es scheint, dass die Entwickler, die für den Code der debug_backtrace
-Funktion verantwortlich sind (oder zumindest beibehalten), es nicht als einen Fehler wahrnehmen oder vielleicht keine einfache Möglichkeit, es zu beheben. Es wäre in Ordnung, die line
und file
Elemente mit einigen Platzhalterwerten (z. B. <unknown-file>
und 0
oder sogar Null) zu füllen und es in der Dokumentation zu betonen. Wenn nicht jemand sie erfolgreich dazu überreden kann, müssen Sie nur den Sonderfall in Ihrem Code behandeln.
Ich schrieb oben, nur um mein Verständnis des seltsamen Verhaltens der Funktion zu teilen.Wenn jemand eine Bereitschaft für eine etwas bessere Welt zu kämpfen hat, sind hier einige Links zu verwandten Fehlerberichte:
Der älteste Bericht stammt aus dem Jahr 2003, also sollten Sie nicht zählen Sie auf eine schnelle Lösung :)
Interessant. Können Sie ein Beispiel veröffentlichen? – deceze
Ist es vielleicht innerhalb einer Ausnahme, Schließung, evaled Code, Tick-Funktion, Fehler-Handler, (im Grunde jeder Code, der von der normalen Ausführung Stack funktioniert)? Ansonsten kann ich nicht sehen, warum Sie keine Zeilennummern erhalten würden (ohne ein Beispiel) ... – ircmaxell
@deceze - Der Code ist viel zu komplex, um ein Beispiel zu veröffentlichen. Ich wünschte, ich könnte es, aber es würde wahrscheinlich Stunden oder länger dauern, um etwas zu finden, das einfach genug ist, um es zu veröffentlichen, und es ist nicht so ein großes Problem für mich, die ganze Zeit zu verbringen. – MikeSchinkel