我的PHP文件有点像这个
public_html/environment.php
public_html/task.php
phpbin/actions.php
phpbin/library.php
environment.php由public_html/*包含,在包含任何其他php文件之前,phpbin/*假设environmentphp中的所有内容都已可用。
它定义了这两个全局
$g_foo = "...";
$g_bar = "...";
task.php包括这个逻辑
function do_stuff ()
{
require_once determine_required_file ();
...
}
在这种情况下,determine_required_file()
返回"/path/to/phpbin/actions.php"
actions.php又包含
require_once "/path/to/phpbin/library.php"
最后,library.php包含
$x = $g_foo;
$y = $g_bar;
我得到这个错误:
Undefined variable: $g_bar;
现在,$g_foo
和$g_bar
是严格只读的,除了在environment.php中,我已经详尽地映射并验证了没有其他地方可以使用这些名称创建或修改变量。
我知道PHP全局变量是很奇怪的,做一些事情,比如在函数中包含文件,可能会扰乱你的范围。我知道我可能应该使用define()
或其他方法,是的。
我的问题是(是的,我要求你在没有完整代码的情况下进行推测,对不起):
为什么$g_bar
可能会生成错误,而$g_foo?
却不会生成
我认为函数内包含可能是罪魁祸首,但假设这些全局变量真的是只读的,我应该寻找什么作为的罪魁祸首?为什么一个最终在library.php的全局范围内,而不是另一个?
对于需要全局变量的字段,需要使用include_once
而不是required_once
,或者定义global $g_bar, $g_foo
。
http://php.net/manual/en/language.variables.scope.php