【问题标题】:Unable to access global variable in included file无法访问包含文件中的全局变量
【发布时间】:2011-09-01 22:20:42
【问题描述】:

我遇到了一个意外的范围问题。 include documentation(也适用于require_once)表示所需的文件应该可以访问所需行的所有变量。

由于某种原因,我无法访问在所需的函数内使用全局范围实例化的类。

有人知道为什么吗?我显然错过了一些东西。

我通过对$GLOBALS[] 的引用让它工作了,但我仍然想知道它为什么不工作。

更新:
我得到的错误是:

Fatal error: Call to a member function isAdmin() on a non-object in <path>.php on <line>

代码:

$newClass = new myClass();

require_once("path to my file");

----- inside required file -----
function someFunction() {
     $newClass->someMethod(); // gives fatal error. (see above).
}

【问题讨论】:

    标签: php include scope global-variables


    【解决方案1】:

    函数定义了一个新的作用域,所以在函数内部你不能访问全局作用域中的变量。

    Variable Scope

    在用户定义的函数中,本地 引入了函数作用域。任何 函数内部使用的变量是 默认仅限于本地函数 范围

    关于包含的文件,the manual states:

    当一个文件被包含时,它的代码 contains 继承变量范围 包含的行的 发生。

    因此,如果您在函数中包含某些内容,则包含文件的范围将是函数的范围。

    更新:查看您在问题中编辑的代码示例,global $newClass; 作为函数的第一行应该可以使其正常工作。

    $newClass = new myClass();
    require_once("path to my file");
    
    ----- inside required file -----
    function someFunction() {
         global $newClass;
         $newClass->someMethod(); 
    }
    

    请注意,尽管使用global 会很快使您的代码更难维护。不要依赖全局作用域,您可以将对象作为参数传递给函数,或使用 Singleton/Registry 类(有些人倾向于反对后者,但视情况而定,它可能是更简洁的解决方案)。

    【讨论】:

    • 我什至尝试调用 global $myClass;不工作。它确实适用于 $GLOBALS["myClass"]。
    • 查看您在问题中编辑的代码示例,global $newClass; 作为函数的第一行应该可以使其正常工作。
    • @John, global $myClass(或上面示例中的global $newClass)应该可以正常工作。我现在刚刚对其进行了测试,它与在主脚本中定义函数没有任何不同。
    • bazmegakapa:谢谢。我将本地变量定义为“全局(refTObj)”,然后使用本地变量。
    【解决方案2】:

    包含的代码与它周围的代码没有不同的范围。例如:

    function a() {
        echo $b;
    }
    

    即使echo $b 在包含的文件中,这也会失败。如果您将上述内容替换为:

    function a() {
        include 'file.php';
    }
    

    ...和file.php 包含:

    echo $b;
    

    ...那么就像你写的一样:

    function a() {
        echo $b;
    }
    

    这样想:每当你使用include/require,包含文件的内容将替换include/require语句,就像你删除语句并粘贴文件的内容在它的位置。

    就范围而言,它不会做任何其他事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多