我在范围方面遇到了意想不到的问题。 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).
}
答案 0 :(得分:3)
函数定义一个新范围,因此在函数内部不能访问全局范围内的变量。
用户定义的函数中的是本地的 功能范围介绍。任何 函数内部使用的变量是 默认限制为本地功能 范围
关于包含的文件,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
语句,就像如果您删除了该语句并将文件的内容粘贴到其位置。
就范围而言,它没有做任何其他事情。