php脚本是否有可能知道另一个脚本是通过require还是require_once调用它?
例如:
if scripta.php calls me do xyz;
if scriptb.php calls me do abc;
编辑:感谢您的建议。这更像是一个假设问题,而不是一个实际问题。我意识到我可以设置一个变量,$caller并在我做出 require 语句时更新它。我只是想知道在被称为:)的文件中是否有另一种方法可以做到这一点
如果您只想检查您的文件是否包含在内:
$_SERVER['SCRIPT_FILENAME']
将始终返回最初调用的脚本的文件名。(例如"开始.php")
常量__FILE__
将始终返回使用它的脚本的真实文件名。(例如"library.inc.php")
所以你可以做这样的事情:
if ($_SERVER['SCRIPT_FILENAME'] !== __FILE__) {
echo "script was included!";
}
else {
echo "script was called directly!";
}
如果要区分文件的包含位置:
$include_from = get_included_files();
if (count($include_from) > 1) {
$include_from = $include_from[count($include_from)-2];
}
else {
$include_from = $include_from[0];
}
switch ($include_from) {
case __FILE__:
// not included, called directly
break;
case "/path/to/scripta.php":
// do abc
break;
case "/path/to/scriptb.php":
// do xyz
break;
default:
// do other stuff
break;
}
您可以通过 get_included_files()
按包含文件的顺序检索文件(返回文件名数组)。
- 执行的主文件始终是第 0 个元素。
- 如果要查找包含当前文件的文件,则最后一个元素(只有一个元素)是候选项。
我建议使用get_included_files(或get_required_files
):
if(in_array($my_file, get_included_files())
{
// do something
}
将$my_file
替换为需要检查的文件。
一种可能性是定义常量。
调用脚本:
define("SCRIPT_NAME", "script_a.php");
在调用的脚本中:
if(defined("SCRIPT_NAME") && SCRIPT_NAME == "script_a.php") {
// Do stuff
}
您可以使用debug_backtrace()
例:
如果在包含的文件上使用 debug_backtrace():
array(1) {
[0]=> array(3) {
["file"]=> string(71) "/home/index.php"
["line"]=> int(3)
["function"]=> string(7) "require"
}
}
require不是
别的,而是将代码截取加载到调用require或require_once调用的确切位置。
如果你真的想知道确切的文件在调用它,你可以做一个相对脏的,并在调用之前分配一个变量,并在脚本中检查它有什么样的值
例如
$require_reference = "main.php";
require_once ("some_script.php");
现在在some_script.php里面,你做这样的事情:
if (isset($require_reference) && $require_reference == "main.php")
{
// dome something
}
这将起作用,但它真的很混乱。也许你应该尝试重构你的设计