【问题标题】:require_once to global scope within a functionrequire_once 到函数内的全局范围
【发布时间】:2012-02-18 14:32:47
【问题描述】:

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

【问题讨论】:

  • 您可以在包含的文件中设置全局变量,也可以使用不同的方式来做您想做的事情,也许使用自动加载器、反射等。您可以向我们提供更多信息,我们也许可以想更好的东西。我真的不喜欢将全局范围用于可以以不同方式完成的任务。
  • ofc 你可以在函数中包含文件,并且该文件中的任何全局内容都将在全局范围内可用...
  • 这就是他们的模块加载了多少个框架......例如检查codeigniter的load_class函数
  • @Dunhamzzz,这不是完全相同的副本,链接的问题表明没有解决方案,我正在寻求解决方法

标签: php scope require-once


【解决方案1】:

总结所有信息:

  1. 函数不是问题,无论如何它们都是全局的

  2. 对于全局变量,有两种选择:

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

【讨论】:

  • 3.不,似乎不可能从函数内部为 require_once 应用全局范围。 (悲伤的脸。)
【解决方案2】:

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

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

并在 a.php 文件中:

global $globalVariable;
$globalVariable="text";

【讨论】:

  • 遗憾的是,“小心”对我不起作用,因为我有许多全局变量(其中许多仅在软件开发期间可用),我无法添加 @987654324 @-keyword 每次我需要一个新变量时。似乎我必须在全球范围内包含我可能需要的所有文件(而不是动态选择其中一个)
【解决方案3】:

功能不是问题 (ref):

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

关于全局变量:与现有的关于require 等范围的问题一样,范围是在使用的地方定义的。如果您需要其他东西,有很多答案 (my take) 展示了如何处理全局变量,大多数使用 get_defined_vars

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 嗯??这如何回答这个问题?函数呢?
    • 糟糕。好点子。不过,我仍然可以在另一个函数中调用该函数。 codepad.org/JvyvP3fU
    猜你喜欢
    • 2017-01-20
    • 2015-09-27
    • 2013-07-13
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多