我想,其中包括从包含文件中其他文件的文件名。
我知道还有就是__FILE__
魔术常量,但没有帮助,因为它返回所包含的文件的名称,而不是其中包括 。
有没有办法做到这一点? 或者是不可能的,因为路上PHP解释?
我想,其中包括从包含文件中其他文件的文件名。
我知道还有就是__FILE__
魔术常量,但没有帮助,因为它返回所包含的文件的名称,而不是其中包括 。
有没有办法做到这一点? 或者是不可能的,因为路上PHP解释?
这实际上是一个什么样的PHP模板引擎做的只是一个特例。 考虑具有这种功能:
function ScopedInclude($file, $params = array())
{
extract($params);
include $file;
}
然后A.php
可包括C.php
是这样的:
<?php
// A.php
ScopedInclude('C.php', array('includerFile' => __FILE__));
此外, B.php
可以包括C.php
无故障的方法相同。
<?php
// B.php
ScopedInclude('C.php', array('includerFile' => __FILE__));
C.php
可以知道通过看$ params数组在其包入。
<?php
// C.php
echo $includerFile;
所以这个问题是很老,但我一直在寻找的答案,离开这里后不满意,我碰到$_SERVER['SCRIPT_FILENAME'];
当然这工作,如果PHP文件做的,包括是一个网页。
这给你服务器上的“包括文件”的完整路径。 例如/var/www/index.php。 所以如果你想只是文件名,例如index.php文件,你需要使用基名()如
basename($_SERVER['SCRIPT_FILENAME']);
所以,如果在你的index.php,你有下面这行:
<?php include("./somephp.php"); ?>
在somephp.php你有
echo "this is the file that included me: " . basename($_SERVER['SCRIPT_FILENAME']);
你会得到
this is the file that included me: index.php
输出到浏览器。 这也适用,如果用户访问您的文件,而不明确包括在URL中的文件名,例如www.example.com
,而不是www.example.com/index.php
。
明知用于包含文件的功能include
, include_once
, require
和require_once
,也知道他们被保留在PHP的话,这意味着它是不可能使用相同的名称来声明用户功能,并根据韦奇伍德的想法使用debug_backtrace
你其实可以从哪些文件中包括被称为锻炼。
我们现在要做的是遍历回溯,直到我们找到了最近一次调用任意四种包括功能,以及它被称为文件。 下面的代码demostrate的技术:
function GetIncludingFile()
{
$file = false;
$backtrace = debug_backtrace();
$include_functions = array('include', 'include_once', 'require', 'require_once');
for ($index = 0; $index < count($backtrace); $index++)
{
$function = $backtrace[$index]['function'];
if (in_array($function, $include_functions))
{
$file = $backtrace[$index]['file'];
break;
}
}
return $file;
}
上面的代码将返回后,其中包括发生在文件的绝对路径,如果没有发生过任何包括它会返回false。 需要注意的是可以一直将文件从一个从另一个文件包含的文件包括,上述功能仅适用于最深包括。
通过简单的修改,你也可以得到最后一个包含文件:
function GetIncludedFile()
{
$file = false;
$backtrace = debug_backtrace();
$include_functions = array('include', 'include_once', 'require', 'require_once');
for ($index = 0; $index < count($backtrace); $index++)
{
$function = $backtrace[$index]['function'];
if (in_array($function, $include_functions))
{
$file = $backtrace[$index - 1]['file'];
break;
}
}
return $file;
}
需要注意的是__FILE__
不包含的文件,但当前文件。 例如:
文件a.php只会:
<?php
function callme()
{
echo __FILE__;
}
?>
文件B.php:
<?php
include('A.php');
callme();
?>
index.php文件:
<?php
include('B.php');
?>
在上述例子中,在文件B.php所包含的文件的上下文中是B.php(以及包括文件是的index.php),但该函数的输出callme
是a.php只会的路径,因为__FILE__
是在甲.PHP。
另外请注意, $_SERVER['SCRIPT_FILENAME']
将给予客户端请求的脚本的绝对路径。 如果$_SERVER['SCRIPT_FILENAME'] == __FILE__
这意味着当前的文件是要求之一,因此有可能一直没有任何包括...
上述方法检查如果当前文件是所请求的一个,但如果未包括它(下面是所需的文件如何被包括的示例)。 一个实际的解决方案,以检查是否有一直没有任何夹杂物可能是检查count(get_included_files()) == 1
。
所请求的文件可以通过以下方式所包含的文件:
文件x.php
<?php
$var = 'something';
include('index.php');
?>
index.php文件
<?php
if (!isset($var))
{
include('x.php');
exit;
}
echo 'something';
?>
在上面的例子中,文件的index.php将包括x.php,然后x.php将包括的index.php回来,事后的index.php输出“东西”,并将控制返回到x.php,x.php将控制返回到索引.php然后到达出口;
这表明,即使是index.php的请求的脚本,它也从另一个脚本包括在内。
我找不到简单的方法来掩盖这一点。 但是,如果包括一个对你很重要,你可以用一些全局变量破解它和你自己的include函数。
如
<?php
$g_including_files = array();
function my_include($file) {
$bt = debug_backtrace();
global $g_including_files;
$g_including_files[basename($file)] = $bt[0]['file'];
return include($file);
}
可以说是对你有帮助:)