Получить имя файла, включающего PHP-скрипт

Вот пример того, что я пытаюсь сделать:

index.php

<ul><?php include("list.php") ?></ul>

список.php

<?php
    if (PAGE_NAME is index.php) {
        //Do something
    }
    else {
        //Do something
    }
?>

Как я могу получить имя файла, включающего скрипт list.php (PAGE_NAME)? Я пробовал basename(__FILE__), но это дает мне list.php.


person valon    schedule 24.07.2011    source источник
comment
Зачем вам это нужно? В вашей ситуации может быть обходной путь.   -  person esqew    schedule 24.07.2011
comment
У меня есть два типа файлов, index.php, а остальные файлы — это статьи. Статьи находятся в файле article/year/month/day/name.php, каждый из которых использует list.php для получения списка статей, которые отображаются на панели, проблема заключается в расположении скрипта, который подключается к моей базе данных дальше от статьи. страницы. Итак, я делаю условие, чтобы увидеть, нужно ли включать (../inc/conn.php) или включать (../../../../../inc/conn.php)   -  person valon    schedule 24.07.2011


Ответы (6)


$_SERVER["PHP_SELF"]; возвращает то, что вы хотите

person Caner    schedule 24.07.2011

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

$trace = debug_backtrace();

$from_index = false;
if (isset($trace[0])) {
    $file = basename($trace[0]['file']);

    if ($file == 'index.php') {
        $from_index = true;
    }
}

if ($from_index) {
    // Do something
} else {
    // Do something else
}
person zerkms    schedule 24.07.2011
comment
Или просто файл debug_backtrace()[0]['file'] - person Solomon Ucko; 06.06.2017
comment
Блестящая стенография, @SolomonUcko! - person Rounin; 23.10.2019

Если кто-то попал сюда из поисковой системы, принятый ответ будет работать, только если скрипт находится в корневом каталоге сервера, поскольку PHP_SELF — это имя файла с путем относительно корня сервера. Итак, универсальное решение

basename($_SERVER['PHP_SELF'])

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

person Maciej Krawczyk    schedule 05.06.2015
comment
Спасибо за объяснение поведения в случае вложенных включений! - person kittykittybangbang; 22.09.2016

В коде, включающем list.php, перед включением вы можете установить переменную с именем $this_page, а затем list.php сможет увидеть тест для значения $this_page и действовать соответствующим образом.

person plague    schedule 24.07.2011

Возможно, вы можете сделать что-то вроде следующего:

<ul>
    <?php
        $page_name = 'index';
        include("list.php")
    ?>
</ul>

список.php

<?php
    if ($pagename == 'index') {
        //Do something
    }
    else {
        //Do something
    }
?>
person PeeHaa    schedule 24.07.2011
comment
Не работает. Во-первых, вы ошиблись с $page_name и $pagename. Тогда list.php не сможет увидеть $page_name, если вы использовали $page_name в обоих сценариях. - person ; 18.06.2016

Решение basename($_SERVER['PHP_SELF']) работает, но я рекомендую поставить strtolower(basename($_SERVER['PHP_SELF'])) для проверки ошибок 'Index.php' или 'index.php'.

Но если вам нужна альтернатива, вы можете сделать следующее:
<?php if (strtolower(basename($_SERVER['SCRIPT_FILENAME'], '.php')) === 'index'): ?>.

person Atahualpa Silva Falcón    schedule 21.12.2015