Получить константу __FILE__ для функции caller в PHP
Я знаю, что волшебная константа __FILE__
в PHP превратится в полный путь и имя файла исполняемого файла. Но есть ли способ получить такую же информацию для файла вызова функции? Например:
//foo.php:
include "bar.php";
call_it();
//bar.php
function call_it() {
echo "Calling file: ".__CALLING_FILE__;
}
который выводит Calling file: ....../foo.php
.
Я знаю, что нет магической константы __CALLING_FILE__
или волшебной константы, чтобы справиться с этим, но есть ли способ получить эту информацию? Наименее хакерское решение было бы идеальным (например, использование трассировки стека было бы довольно хаки), но в конце мне просто нужно, чтобы он работал.
Ответы
Ответ 1
вы должны взглянуть на трассировку стека для выполнения таких действий. 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 обрабатывает формирование и печать всей информации само по себе.
Ответ 2
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';
}
}