2

php 脚本是否有可能知道另一个脚本是否通过 require 或 require_once 调用它?

例如:

if scripta.php calls me do xyz;
if scriptb.php calls me do abc;

编辑:谢谢你们的建议。这更像是一个假设问题,而不是一个实际问题。我意识到我可以设置一个变量 $caller 并在我发出 require 语句时对其进行更新。我只是想知道在被调用的文件中是否有另一种方法可以做到这一点:)

4

6 回答 6

5

如果您只想检查您的文件是否包含在内:

$_SERVER['SCRIPT_FILENAME']将始终返回最初调用的脚本的文件名。(例如“start.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;
}
于 2012-08-10T09:22:06.797 回答
3

您可以按包含文件的顺序检索文件get_included_files()(返回文件名数组)。

  • 执行的主文件始终是第 0 个元素。
  • 如果您正在寻找包含当前文件的文件,那么最后一个元素就是您的候选者。
于 2012-08-10T09:25:18.487 回答
2

我建议使用get_included_files(或get_required_files):

if(in_array($my_file, get_included_files())
{
    // do something
}

替换$my_file为您需要检查的文件。

于 2012-08-10T09:26:47.607 回答
1

您可以使用debug_backtrace()

例子:

如果您在包含的文件上使用 debug_backtrace() :

array(1) {
    [0]=> array(3) {
        ["file"]=> string(71) "/home/index.php"
        ["line"]=> int(3)
        ["function"]=> string(7) "require"
    }
} 
于 2012-08-10T09:14:44.217 回答
1

一种可能性是定义常量。

调用脚本:

define("SCRIPT_NAME", "script_a.php");

在被调用的脚本中:

if(defined("SCRIPT_NAME") && SCRIPT_NAME == "script_a.php") {
    // Do stuff
}
于 2012-08-10T09:16:49.503 回答
0

一个 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 
}

这会起作用,但它真的很乱。也许你应该尝试重构你的设计

于 2012-08-10T09:17:36.633 回答