我知道PHP中的__FILE__
魔术常量将变成当前正在执行的文件的完整路径和文件名。但有没有办法可以为函数的调用文件获取相同的信息?例如:
//foo.php:
include "bar.php";
call_it();
//bar.php
function call_it() {
echo "Calling file: ".__CALLING_FILE__;
}
将输出Calling file: ....../foo.php
。
我知道没有__CALLING_FILE__
魔法常数或魔法常数来处理这个问题,但有没有办法可以获得这些信息?最不讨厌的解决方案是理想的(例如,使用堆栈跟踪会很糟糕)但最终我只需要它就可以工作。
答案 0 :(得分:26)
你应该看一下堆栈跟踪来做这些事情。 PHP有一个名为debug_backtrace
include "bar.php";
call_it();
//bar.php
function call_it() {
$bt = debug_backtrace();
echo "Calling file: ". $bt[0]['file'] . ' line '. $bt[0]['line'];
}
希望有所帮助
基于你可以找到debug_print_backtrace
有用的相同原理,它做同样的事情,但php自己处理所有信息的格式化和打印。
答案 1 :(得分:3)
debug_backtrace()
是你的朋友
这就是我们用来转储当前行的完整堆栈跟踪。要根据您的情况进行调整,请忽略$trace
数组的顶部。
class Util_Debug_ContextReader {
private static function the_trace_entry_to_return() {
$trace = debug_backtrace();
for ($i = 0; $i < count($trace); ++$i) {
if ('debug' == $trace[$i]['function']) {
if (isset($trace[$i + 1]['class'])) {
return array(
'class' => $trace[$i + 1]['class'],
'line' => $trace[$i]['line'],
);
}
return array(
'file' => $trace[$i]['file'],
'line' => $trace[$i]['line'],
);
}
}
return $trace[0];
}
/**
* @return string
*/
public function current_module() {
$trace_entry = self::the_trace_entry_to_return();
if (isset($trace_entry['class']))
return 'class '. $trace_entry['class'];
else
return 'file '. $trace_entry['file'];
return 'unknown';
}
public function current_line_number() {
$trace_entry = self::the_trace_entry_to_return();
if (isset($trace_entry['line'])) return $trace_entry['line'];
return 'unknown';
}
}