0

因此,我正在尝试制作一种允许即时记录调试消息的方法,并且我想包括出现消息的文件名和行号。我的第一个倾向是将 debug_backtrace() 作为记录方法的参数之一,它返回一个包含当前文件名和行号的数组。

问题是,这只给出了第一个文件(index.php)的文件和行。index.php 只是一个五行文件,它从包含文件中的类调用方法但是,因此行和文件信息总是说(index.php,第 5 行)无论如何都是无用的。

无论您在代码中的哪个位置,有没有办法获取当前行和文件?

添加

这是文件和行信息:

[2011-01-23 06:26:10] 信息:“请求不存在的控制器(测试)。”,文件:“/home/spotless/public_html/mymvc/index.php”,行:5,请求: “/测试”

这是 index.php 的全部内容:

<?php

    include_once('application/init.php');
    lev_init::init();
?>

这是在 init.php 文件(第 37 行)中使用 debug_backtrace() 的日志记录调用:

// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', debug_backtrace());

第二次更新

debug_backtrace 的 var_dump

数组(1) { [0]=> 数组(6) { ["file"]=> string(42) "/home/spotless/public_html/mymvc/index.php" ["line"]=> int(5 ) ["function"]=> string(4) "init" ["class"]=> string(8) "lev_init" ["type"]=> string(2) "::" ["args"]= > 数组(0) { } } }

4

2 回答 2

2

如果您在全局上下文中使用 this 而不是函数,那么您显示的是正常行为。文件的包含反映在调用堆栈中 - 仅反映函数和方法的调用。

据我所知,没有办法构建“包含跟踪”,嵌套的列表包含一行代码。这已在 SO 和 IIRC 上反复询问,但从未找到解决方案。

于 2011-01-24T00:46:13.487 回答
1

debug_backtrace返回一个数组,所以做一个var_export(debug_backtrace(), true)

IE:

// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', var_export(debug_backtrace(), true));

笔记:

只需编辑堆栈跟踪的内容/位置。

<?php
// filename: /tmp/a.php

function b_test($foo)
{
   var_dump(debug_backtrace());
}

function a_test($str)
{
    echo "\nHi: $str";
    b_test('bar');
    var_dump(debug_backtrace());
}

a_test('friend');
?>

<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';

?>

b_test 中的 debug_backtrace 将显示包含在内的所有内容。a_test 中的那个不会显示 b_test 调用,因为它已经返回......

于 2011-01-24T00:35:37.463 回答