问题 require_once到函数内的全局范围


似乎如果 require_once 在函数内调用,包含的文件不扩展全局变量范围。 如何 require_once 函数中的文件到全局范围?

我想要做的是一些动态模块加载器:

function projects_init()
{
        ...
        foreach ($projects as $p) {
                require_once($p['PHPFile']);

                $init_func = $p['init'];
                if ($init_func)
                        $init_func();
        }
}

如果不可能使用 require_once 那样,最简单的解决办法是什么? (请不要沉重的框架。)

编辑:它也适用于PHP 5.2。


9311
2018-01-25 11:48


起源

可能重复 有没有办法将require_once()的范围显式设置为全局? - Dunhamzzz
您可以在包含的文件中设置全局变量,也可以使用不同的方式执行您想要执行的操作,可能使用自动加载器,反射等。您可以向我们提供更多信息,我们可能会更好地思考。我真的不喜欢将全局范围用于可以以不同方式完成的任务。 - mobius
ofc你可以在一个函数中包含文件,并且该文件中的任何内容都是全局的,它将全局可用... - Tudor
这就是他们模块加载了多少框架...例如检查codeigniter的load_class函数 - Tudor
@Dunhamzzz,它不是完全重复的, 链接的问题陈述没有解决方案,我要求解决方法! - TMS


答案:


以上答案是对的,你可以使用 global 得到你需要的东西。 在包含文件中只是在文件开头声明变量global,这样代码将在函数范围内运行,但它会改变全局变量(是的,你必须小心并声明你需要改变的全局变量但它应该工作),例如:

function a() {
     require_once("a.php");
}
a();
echo $globalVariable;

并在a.php文件中:

global $globalVariable;
$globalVariable="text";

5
2018-01-25 12:07



可悲的是,“小心”不适合我,因为我有很多全局变量(其中许多只在软件开发期间可用),我无法添加 global-keyword每次我需要一个新的变量。似乎我必须包括我可能需要全局的所有文件(而不是动态地选择其中一个) - maja


总结所有信息:

  1. 功能不是问题,无论如何它们都是全球性的

  2. 对于全局变量,有2个选项:

    • 在包含的文件中将它们声明为全局
    • 在该函数中声明它们是全局的(projects_init() 在我的情况下)

5
2018-01-26 09:23



3.不,似乎不可能在函数内部应用require_once的全局范围。 (悲伤的脸。) - Dustin Graham


功能不是问题(REF):

PHP中的所有函数和类都具有全局范围 - 即使它们是在内部定义的,也可以在函数外部调用它们,反之亦然。

关于全局变量:如关于范围的现有问题 require 等等,范围被定义在使用的地方。如果你需要别的东西,有很多答案(我的看法)展示如何处理全局变量,大多数利用 get_defined_vars


2
2018-01-26 10:24





您可以使用 global 将变量放在全局范围内。

http://php.net/manual/en/language.variables.scope.php


1
2018-01-25 11:54



嗯?这是如何回答这个问题的?功能怎么样? - TMS
哎呀。好点子。我仍然可以调用其他函数内部的函数。 codepad.org/JvyvP3fU
好的,谢谢 - 它也适用于PHP 5.2。 - TMS