在函数内将 require_once 引入到全局作用域

14

似乎如果在函数内部调用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。

你可以在被包含的文件中设置全局变量,或者用自动加载器、反射等不同的方式实现你想要的功能。如果提供更多信息,我们可能能够想出更好的解决方案。我不太喜欢使用全局范围来完成可以以不同方式完成的任务。 - mobius
这就是许多框架进行模块加载的方式...以CodeIgniter的load_class函数为例进行检查。 - Tudor
@Dunhamzzz,这不是完全重复的问题,链接的问题说明没有解决方案,而我正在寻求解决方法! - Tomas
显示剩余6条评论
4个回答

7

总结所有信息:

  1. 函数不是问题,它们将以全局方式存在

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

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

3
不,似乎不可能在函数内部应用 require_once 的全局范围。(难过表情) - Dustin Graham

6
上面的答案是正确的,你可以使用global来获取你需要的内容。 在包含的文件中,在文件开头声明变量为全局变量,这样代码将在函数作用域中运行,但它会更改全局变量(是的,你必须小心并声明你需要更改的所有变量为全局变量,但它应该能够工作),例如:
function a() {
     require_once("a.php");
}
a();
echo $globalVariable;

在a.php文件中:

global $globalVariable;
$globalVariable="text";

很遗憾,“小心谨慎”对我不起作用,因为我有很多全局变量(其中许多只在软件开发期间可用),我不能每次需要新变量就添加“global”关键字。似乎我必须全局包含所有可能需要的文件(而不是动态选择其中一个)。 - maja

2

2
额??这怎么回答问题了呢?函数呢? - Tomas
1
哎呀,说得好。不过我仍然可以在另一个函数中调用这个函数。http://codepad.org/JvyvP3fU - user215361

2

函数不是问题(参考):

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

关于全局变量:与关于 require 等范围的现有问题一样,范围是在使用时定义的。如果您需要其他东西,有许多答案(我的看法)显示如何处理全局变量,大多数使用 get_defined_vars


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接