PHP-вывод __FILE__ внутри включенного файла - PullRequest
4 голосов
/ 17 октября 2010

Хорошо, вот очень короткий запрос. Я звоню __FILE__ изнутри функции. Теперь эта функция находится в обязательном файле.

Теперь, когда я вызову эту функцию из родительского файла, __FILE__ выведет родительский файл или файл, который был включен?

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

Кроме того, если это должно отображать дочерний (включенный) файл, как мне поступить так, чтобы он скорее отображал родительский путь к файлу? (какой-то вариант или что-то?)

Ответы [ 4 ]

3 голосов
/ 17 октября 2010

__FILE__ всегда заменяется именем файла, в котором появляется символ.

Чтобы получить имя файла, из которого была вызвана функция, вы можете использовать debug_backtrace(). Это возвращает текущий стек вызовов в виде массива, причем каждый вложенный массив содержит файл, строку и функциональные клавиши, с которых был сделан вызов.

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

a.php:

<?php

require_once('b.php');

b();

b.php:

<?php

function b() {
   $bt = debug_backtrace();
   var_export($bt); 
}

выход:

array (
  0 => array (
    'file'     => '/home/meagar/a.php',
    'line'     => 5,
    'function' => 'b',
    'args'     => array( ),
  ),
)

То же самое работает без вызовов функций:

a.php:

<?php require_once('b.php');

b.php:

<?php
$bt = debug_backtrace();
var_export($bt);

выход:

array (
  0 => array (
    'file'     => '/home/meagar/a.php',
    'line'     => 3,
    'function' => 'require_once',
  ),
)
3 голосов
/ 17 октября 2010

Документ гласит:

__ FILE __
Полный путь и имя файла файла. Если используется во включении, возвращается имя включенного файла.

0 голосов
/ 01 апреля 2016

Вот пример того, как я исправил это в одном из моих проектов.

Проблема. У меня был следующий метод, который я вызывал в разделе head моего HTML-шаблона:

public static function loadPageSpecificStyle()
{
    $directory_files = scandir(dirname(__FILE__));

    foreach($directory_files as $key => $file_name)
    {
        if(strpos($file_name, 'css') !== FALSE)
        {
            echo '<link rel="stylesheet" type="text/css" href="' . $file_name . '" />';
        }
    }
}

Решение. Я передал константу __FILE__ в качестве аргумента:

public static function loadPageSpecificStyle($file_as_argument)
{
    $directory_files = scandir(dirname($file_as_argument));

    foreach($directory_files as $key => $file_name)
    {
        if(strpos($file_name, 'css') !== FALSE)
        {
            echo '<link rel="stylesheet" type="text/css" href="' . $file_name . '" />';
        }
    }
}

На head моей страницы я просто позвонил так: WhateverClass::loadPageSpecificStyle(__FILE__);

Надеюсь, это поможет!

0 голосов
/ 17 октября 2010

Насколько мне известно, то, что вы ищете - получение пути "родительского" включает в себя то, что само по себе является включением - невозможно, даже с использованием debug_backtrace().

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

...