Подтвердить что ты не робот

Поиск имени файла, который вызвал мою функцию в PHP

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

Например,

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

Ответ 1

Решением может быть использование функции debug_backtrace: в 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 поможет многое, там...); но это может помочь вам получить первую идею...

Ответ 2

В дополнение к предложению Паскаля Мартинса вы можете установить расширение 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().

Ответ 3

Попробуйте следующее:

$key = array_search(__FUNCTION__, array_column(debug_backtrace(), 'function')));
var_dump(debug_backtrace()[$key]['file']);

Ответ 4

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

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

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

sthing(__FILE__);