要求相反?

时间:2012-08-10 09:12:42

标签: php

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

例如:

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

编辑:感谢您的建议。这更像是一个问题,而不是一个实际的问题。我意识到我可以设置一个变量$ caller并在我创建require语句时更新它。我只是想知道是否有另一种方法可以在被调用的文件中执行此操作:)

6 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:3)

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

  • 执行的主文件始终是第0个元素。
  • 如果您正在寻找包含当前文件的文件,那么最后一个元素就是您的候选人。

答案 2 :(得分:2)

我建议使用get_included_files(或get_required_files):

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

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

答案 3 :(得分:1)

您可以使用debug_backtrace()

示例:

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

array(1) {
    [0]=> array(3) {
        ["file"]=> string(71) "/home/index.php"
        ["line"]=> int(3)
        ["function"]=> string(7) "require"
    }
} 

答案 4 :(得分:1)

一种可能性是定义常数。

调用脚本:

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

在被调用的脚本中:

if(defined("SCRIPT_NAME") && SCRIPT_NAME == "script_a.php") {
    // Do stuff
}

答案 5 :(得分:0)

一个需求就是其他任何东西,然后将代码剪切加载到require或require_once调用的确切位置。

如果你真的想知道究竟是什么文件正在调用它,你可以做相对脏的并在调用之前分配一个变量并检查你的脚本里面有什么样的值

e.g。

$require_reference = "main.php";
require_once ("some_script.php");

现在在some_script.php中你会做这样的事情:

if (isset($require_reference) && $require_reference == "main.php")
{ 
    // dome something 
}

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