包含的PHP文件可以知道它包含在哪里吗?

web*_*at0 18 php

例如,

这是index.php

<?
require_once('header.php');
?>
Run Code Online (Sandbox Code Playgroud)

header.php能知道它被index.php包含了吗?

- 编辑 -

我找到了解决方案:

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

header.php文件

<?
if (backtrace_filename_includes('index.php')) echo "index.php";
?>
Run Code Online (Sandbox Code Playgroud)

Cha*_*les 9

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

这意味着如果a.php包括b.php,包括c.php,c.php将无法知道这b.php是包含者.你能得到的最好的a.php就是当前正在执行的脚本.


编辑:是的,我的上述答案在技术上是错误的 - 你可以debug_backtrace用来找到调用者,即使没有函数,直到PHP 5.4,这将删除此功能.

a.php只会:

<?php
echo 'A';
include 'b.php';
Run Code Online (Sandbox Code Playgroud)

b.php:

<?php
echo 'B';
include 'c.php';
Run Code Online (Sandbox Code Playgroud)

c.php:

<?php
echo 'C';
print_r(debug_backtrace());
Run Code Online (Sandbox Code Playgroud)

输出:

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
        )

)
Run Code Online (Sandbox Code Playgroud)

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

  • 从技术上讲,脚本可以通过使用debug_backtrace()找出它所包含的位置,但这是不可取的;) (3认同)

小智 5

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"
}
Run Code Online (Sandbox Code Playgroud)

所以test_include.php只需要做一些array_pop'ing就可以找出包含它的人.