我在理解PHP中的包含和函数范围方面遇到了一些麻烦,并且一些谷歌搜索没有提供成功的结果。但问题出在这里:
这不起作用:
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
}
基本上,$lang
和left_side.php
中有一个名为left_side2.php
的数组。我想在b()
内访问它,但上面的代码设置会说$lang
未定义。但是,当我在include_a()
的开头复制并粘贴b()
中的确切代码时,它会正常工作。但是你可以想象,我不希望在我需要的每个函数中复制和粘贴代码。
如何缓解此范围问题以及我做错了什么?
答案 0 :(得分:2)
如果数组$lang
在include_a()
函数内定义,则它仅限于该函数,即使该函数在b()
内调用。要访问$lang
内的b()
,您需要全局调用它。
这是因为include 'left_side2.php';
函数中的include_a()
。如果在包含内部定义了多个变量,并且您希望它们处于全局范围,那么您需要将它们定义为这样。
在left_side.php
内,将其定义为:
$GLOBALS['lang'] = whatever...;
然后在调用它们的函数中,试试这个:
function b() {
include_a();
print_r($GLOBALS['lang']); // Now $lang should be known.
}
答案 1 :(得分:1)
在你不需要的情况下使用全局变量被认为是“不好的做法”(不是我订阅的,而是普遍接受的)。更好的做法是通过在传递的变量前添加一个&符来传递引用,以便您可以编辑该值。
所以在left_side或left_side2里面你会得到:
b($lang);
和b将是:
function b(&$lang){...}
有关变量范围的进一步定义check this out