例如,
这是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)
虽然$_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过度使用时可能会出现明显的性能拖累.
小智 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就可以找出包含它的人.
| 归档时间: |
|
| 查看次数: |
7072 次 |
| 最近记录: |