Как определить, какой файл PHP использовался для «включения» другого? - PullRequest
1 голос
/ 10 сентября 2009

В PHP при использовании функции включения можно узнать из вставленного файла, какой файл вставлен вами? Например, я часто использую следующую строку в своем коде:

include 'header.php';

Есть ли способ узнать из header.php, какой PHP-файл вставлен вами?

Ответы [ 5 ]

4 голосов
/ 10 сентября 2009

debug_backtrace может вам это сказать.

4 голосов
/ 10 сентября 2009

Одна вещь, которую вы можете сделать, это найти имя файла, который использовался для обработки HTTP-запроса. Если все ваши включения включены непосредственно из этого сценария, вы можете найти полный путь к этому запрошенному сценарию в $_SERVER["SCRIPT_FILENAME"]

Вы также можете просмотреть debug_backtrace () во включенном коде, чтобы определить, какой файл содержит вас, например,

$trace=debug_backtrace();

foreach($trace as $t)
{
    if (in_array($t['function'], 
                 array('include', 'include_once', 'require', 'require_once')))
    {
        echo 'Included from '.$t['file']."\n";
        break;
    }
}
3 голосов
/ 10 сентября 2009

В руководстве по PHP перечислена функция get_included_files , которая как бы связана с тем, что вы хотите ... но один из комментариев на этой странице говорит:

Если вы хотите узнать, какой сценарий включает текущий сценарий, вы можете использовать $ _SERVER ['SCRIPT_FILENAME'] или любой другой аналогичный глобальный сервер.

2 голосов
/ 10 сентября 2009

Хотя в языке нет ничего встроенного, вы можете настроить шаблон кодирования, в котором установлена ​​переменная, которая сообщает исходному файлу, включающему:

$foo_php_old_includer = $includer;
$includer='foo.php';

include 'header.php'; // uses $includer to discern who is including it

// rest of source file

$includer=$foo_php_old_includer;

Если бы в каждом файле было что-то похожее на вышеприведенное, вы должны создать «стек для включения», где каждый файл будет знать, в какой файл он включен.

Все это, как говорится, я подозреваю, что проблему, которую вы пытаетесь решить, может быть лучше решена с помощью другой методологии. Если бы вы могли немного описать проблему, которую вы пытаетесь решить с помощью этого метода, SO может помочь вам найти лучшее решение.

1 голос
/ 10 сентября 2009

Вы можете установить переменную для этого, но это не идеальное решение ...

$CallingFile = 'myfile.php';
include 'header.php';

header.php теперь может запрашивать переменную $ CallingFile, чтобы узнать, кто ее вызвал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...