gpt4 book ai didi

php - 为什么 debug_backtrace() 有时不包含行号?

转载 作者:行者123 更新时间:2023-12-02 16:16:00 25 4
gpt4 key购买 nike

我发现有时debug_backtrace()不包含调用的行号。这有什么原因吗?有什么方法可以纠正它吗?

提前致谢。

附注是的,省略行号的调用是我自己的代码,而不是内部 PHP 代码。

最佳答案

考虑以下代码:

<?
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)' );

执行上述示例会生成以下输出:

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

第一个回溯项(索引 0)间接表示(通过 linefile 项)getTheItem方法是从 __call 调用的方法。

第二个回溯项(索引 1)表示 __call方法是从某处调用的(缺少 linefile 项)。

第三个回溯项(索引 2)表示 test方法是从脚本的全局范围调用的。

__call的位置方法调用可能位于 php 解释器代码中的某个方法解析代码中。有两种修复它的可能性。第二项应引用解释器的源代码文件和行,或者第二项和第三项回溯项应合并为一项。我个人更喜欢第二个解决方案,因为解释器的内部结构对我来说并不有趣(这就是他们在 python 的回溯中似乎这样做的方式),但是我知道有时第一个解决方案提供了更明确的跟踪(特别是当它是一个回调时)从内部调用)。

大概,开发人员似乎负责(或至少维护)debug_backtrace 的代码。函数不会将其视为错误,或者可能没有简单的方法来修复它。填写line就可以了和file具有某些占位符值的项目(例如 <unknown-file>0 甚至 nulls)并在文档中强调它。 除非有人成功说服他们这样做,否则您只需处理代码中的特殊情况即可。

我写上面只是为了分享我对该函数的奇怪行为的理解。如果有人愿意为一个稍微更好的世界而奋斗,这里有一些相关错误报告的链接:

最旧的报告来自 2003 年,因此您不应指望快速修复:)

关于php - 为什么 debug_backtrace() 有时不包含行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4581969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com