Найти имя файла, который вызвал мою функцию в PHP - PullRequest
24 голосов
/ 20 декабря 2009

Как узнать имя файла скрипта, который вызвал мою функцию?

Например,

function sthing() {
echo __FILE__; // echoes myself
echo __CALLER_FILE__; // echoes the file that called me
}

Ответы [ 4 ]

34 голосов
/ 20 декабря 2009

Решением может быть использование функции debug_backtrace: в обратной трассировке должна присутствовать такая информация.

Или, как отметил Гордон в комментарии, вы также можете использовать debug_print_backtrace, если вы просто хотите выводить эту информацию, а не работать с ней.


Например, с temp.php, содержащим это:

<?php
include 'temp-2.php';
my_function();

и temp-2.php, содержащий это:

<?php
function my_function() {
    var_dump(debug_backtrace());
}


Вызов temp.php (i.e. the first script) из моего браузера дает мне такой вывод:

array
  0 => 
    array
      'file' => string '/.../temp/temp.php' (length=46)
      'line' => int 5
      'function' => string 'my_function' (length=11)
      'args' => 
        array
          empty

Там у меня есть имя файла "temp.php" - то, в котором была вызвана функция.


Конечно, вам придется протестировать немного больше (особенно в ситуациях, когда функция находится не во включенном файле «первого уровня», а в файле, включенном другим - не уверен, что debug_backtrace поможет много там ...) ; но это может помочь вам получить первое представление ...

5 голосов
/ 30 марта 2016

Попробуйте это:

$key = array_search(__FUNCTION__, array_column(debug_backtrace(), 'function')));
var_dump(debug_backtrace()[$key]['file']);
3 голосов
/ 20 декабря 2009

В дополнение к предложению Паскаля Мартинса вы можете установить расширение PECL APD и использовать что-то вроде apd_callstack () , что (пример цитирования)

// returns an array containing an array of arrays.

Each array appears to contain:
[0] = function name
[1] = filename that contains function
[2] = *calling* line number in *calling* file
[3] = An array which is usually empty

Но так как это расширение PECL и может мешать работе Zend Optimizer, вам, возможно, лучше использовать debug_backtrace ().

0 голосов
/ 12 июля 2015

Вы можете передать имя файла в качестве параметра:

function sthing($filename) {
  echo __FILE__; // echoes myself
  echo $filename; // echoes the file that called me
}

Когда вы вызываете функцию, вы передаете магическую константу FILE :

sthing(__FILE__);
...