无法访问包含文件中的全局变量

时间:2011-05-25 16:25:04

标签: php include scope global-variables

我在范围方面遇到了意想不到的问题。 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).
}

2 个答案:

答案 0 :(得分:3)

函数定义一个新范围,因此在函数内部不能访问全局范围内的变量。

Variable Scope

  用户定义的函数中的

是本地的   功能范围介绍。任何   函数内部使用的变量是   默认限制为本地功能   范围

关于包含的文件,the manual states

  

当包含文件时,代码就是它   包含继承变量范围   包含的行   发生。

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

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

$newClass = new myClass();
require_once("path to my file");

----- inside required file -----
function someFunction() {
     global $newClass;
     $newClass->someMethod(); 
}

请注意,使用global可能会使代码更难以维护。不要依赖于全局范围,可以将对象作为参数传递给函数,或者使用Singleton / Registry类(有些人倾向于反对后者,但根据情况它可以是一个更清洁的解决方案)。

答案 1 :(得分:2)

包含的代码的范围与其周围的代码不同。例如:

function a() {
    echo $b;
}

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

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

...而file.php包含:

echo $b;

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

function a() {
    echo $b;
}

以这种方式思考:每当您使用include / require时,所包含文件的内容将替换include / require语句,就像如果您删除了该语句并将文件的内容粘贴到其位置。

就范围而言,它没有做任何其他事情。