问题描述
|
我在范围上遇到了意外问题。
include
文档(也适用于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).
}
解决方法
函数定义了新的作用域,因此在函数内部您不能访问全局作用域中的变量。
可变范围
在用户定义的函数中,本地
功能范围介绍。任何
函数内部使用的变量是
默认仅限于本地功能
范围
关于随附文件,该手册指出:
包含文件后,对其进行编码
包含继承变量范围
包含的行的
发生。
因此,如果您在函数中包含某些内容,则所包含文件的范围将是该函数的范围。
更新:查看您的代码示例,该代码示例已编辑成问题,函数的第一行是
global $newClass;
,它应该可以正常工作。
$newClass = new myClass();
require_once(\"path to my file\");
----- inside required file -----
function someFunction() {
global $newClass;
$newClass->someMethod();
}
请注意,尽管使用global
会很快使您的代码难以维护。不依赖于全局范围,您可以将对象作为参数传递给函数,或使用Singleton / Registry类(有些人倾向于反对后者,但视情况而定,这可能是更干净的解决方案) 。
,所包含的代码的范围与周围的代码没有不同。例如:
function a() {
echo $b;
}
即使附带的文件中有“ 9”,也会失败。如果将以上内容替换为:
function a() {
include \'file.php\';
}
...而file.php
包含:
echo $b;
...那就像你写的一样:
function a() {
echo $b;
}
这样想:每当您使用include
/require
时,包含文件的内容将替换include
/require
语句,就像您删除了该语句并将其内容粘贴到其位置一样。
就范围而言,它没有做任何其他事情。