与要求相反


The opposite of require?

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 
}

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

相关文章:
  • 没有找到相关文章