PHP中包含的函数作用域


Function scopes in regards with includes in PHP

我在理解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.phpleft_side2.php中有一个叫做$lang的数组。我想在b()中访问它,但上面的代码设置会说$lang是未定义的。然而,当我在b()的一开始就复制并粘贴include_a()中的确切代码时,它会很好地工作。但正如你所能想象的,我不希望在我需要的每个函数中复制和粘贴代码

我该如何缓解这个范围问题?我做错了什么?

如果数组$langinclude_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){...}

有关变量作用域的进一步定义,请查看