我在理解PHP中的include和函数作用域时遇到了一些困难,在谷歌上搜索一下也没有取得成功。但问题是:
这不起作用:
function include_a(){
// Just imagine some complicated code
if(isset($_SESSION['language'])){
include 'left_side2.php';
} else {
include 'left_side.php';
}
// More complicated code to determine which file to include
}
function b() {
include_a();
print_r($lang); // Will say that $lang is undefined
}
所以本质上,在left_side.php
和left_side2.php
中有一个叫做$lang
的数组。我想在b()
中访问它,但上面的代码设置会说$lang
是未定义的。然而,当我在b()
的一开始就复制并粘贴include_a()
中的确切代码时,它会很好地工作。但正如你所能想象的,我不希望在我需要的每个函数中复制和粘贴代码
我该如何缓解这个范围问题?我做错了什么?
如果数组$lang
在include_a()
函数内定义,则它的作用域仅限于该函数,即使该函数在b()
内调用也是如此。要访问b()
内部的$lang
,需要全局调用它。
发生这种情况是因为您在include_a()
函数中include 'left_side2.php';
。如果includes中定义了几个变量,并且您希望它们在全局范围内,那么您需要将它们定义为全局范围。
在left_side.php
内部,将它们定义为:
$GLOBALS['lang'] = whatever...;
然后在调用它们的函数中,尝试以下操作:
function b() {
include_a();
print_r($GLOBALS['lang']); // Now $lang should be known.
}
在不必使用全局变量的地方使用全局变量被认为是"糟糕的做法"(我不同意这种考虑,但普遍接受)。更好的做法是通过引用传递,在传递的变量前面添加一个"与"符号,这样您就可以编辑值。
因此,在left_side或left_side2中,您会有:
b($lang);
b为:
function b(&$lang){...}
有关变量作用域的进一步定义,请查看