包含的 PHP 文件能否知道它从何处被包含?

php
2022-08-30 21:11:16

例如

这是索引.php

<?
require_once('header.php');
?>

标题.php知道它是否被索引.php包含吗?

--编辑--

我找到了一个解决方案:

function backtrace_filename_includes($name){
    $backtrace_array=debug_backtrace();
    if (strpos($backtrace_array[1]['file'],$name)==false){
        return false;
    }else{
        return true;
    }
}

页眉.php

<?
if (backtrace_filename_includes('index.php')) echo "index.php";
?>

答案 1

虽然 $_SERVER['PHP_SELF'] 将包含当前正在执行的脚本,但无法从包含的文件中确定哪个特定脚本导致了包含。

这意味着如果包含 ,则 包含 ,将无法知道该包含者。你能得到的最好的是当前正在执行的脚本。a.phpb.phpc.phpc.phpb.phpa.php


编辑:是的,我上面的答案在技术上是错误的 - 你可以使用debug_backtrace来查找调用方,即使没有函数,直到PHP 5.4,它删除了这个功能

a.php:

<?php
echo 'A';
include 'b.php';

b.php:

<?php
echo 'B';
include 'c.php';

c.php:

<?php
echo 'C';
print_r(debug_backtrace());

输出:

ABCArray
(
    [0] => Array
        (
            [file] => /tmp/b.php
            [line] => 3
            [function] => include
        )

    [1] => Array
        (
            [file] => /tmp/a.php
            [line] => 3
            [args] => Array
                (
                    [0] => /tmp/b.php
                )

            [function] => include
        )

)

因此,虽然这有效,但您可能不应该使用它。debug_backtrace过度使用时可能会产生明显的性能拖累。


答案 2

get_included_files()提供了一堆包含的文件,按照它们被包含的顺序,在我的情况下,它给了我所需要的一切。

具体来说,如果您在已包含的文件中调用,则该文件自己的文件路径将是 堆栈上返回的最新条目 ,包含该文件的文件路径位于该条目之上,依此类推。get_included_files()get_included_files()

需要注意的是,文件只列出一次,因此,如果同一文件包含多次,则只有第一个包含才会显示在堆栈中。就我而言,这不是一个问题,但这绝对意味着这并非在所有情况下都有效。

具体示例:假设文件“test1.php”包含“test_include.php”。在浏览器中加载 test1.php 后,从“test_include.php”的角度来看get_included_files() 的结果如下(如您所见,我有一个auto_prepend文件,该文件又加载了一个自动加载程序)。

array(4) {
  [0]=>
  string(21) "/www/auto_prepend.php"
  [1]=>
  string(19) "/www/autoloader.php"
  [2]=>
  string(14) "/www/test1.php"
  [3]=>
  string(21) "/www/test_include.php"
}

因此,test_include.php只需要做一点array_pop来弄清楚谁包含它。


推荐