【问题标题】:Function scopes in regards with includes in PHP关于 PHP 中包含的函数范围
【发布时间】:2011-09-19 19:49:08
【问题描述】:

我在理解 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
}

所以本质上,在left_side.phpleft_side2.php 中有一个名为$lang 的数组。我想在b() 中访问它,但是上面的代码设置会说$lang 是未定义的。但是,当我在b() 的开头复制并粘贴include_a() 中的确切代码时,它会正常工作。但正如你可以想象的那样,我不希望将代码复制并粘贴到我需要的每个函数中。

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

【问题讨论】:

    标签: php function include scope


    【解决方案1】:

    如果数组$langinclude_a() 函数内定义,则它的作用域仅限于该函数,即使该函数在b() 内调用也是如此。要在b() 中访问$lang,您需要全局调用它。

    发生这种情况是因为您在include_a() 函数中使用了include 'left_side2.php';。如果在包含中定义了多个变量,并且您希望它们位于全局范围内,那么您需要将它们定义为这样。

    left_side.php内,定义为:

    $GLOBALS['lang'] = whatever...;
    

    然后在调用它们的函数中,试试这个:

    function b() {
        include_a();
        print_r($GLOBALS['lang']); // Now $lang should be known.
    }
    

    【讨论】:

    • 啊,谢谢。我不知道 $GLOBALS 功能。虽然调用关联 $GLOBALS 有一个古怪的语法(即 $GLOBALS['lang']['EMAIL']),但一切都很好。现在也不需要 include_a() 函数了。再次感谢您。
    【解决方案2】:

    在不必要的地方使用全局变量被认为是“不好的做法”(我不同意,但普遍接受)。更好的做法是通过在传递的变量前面添加一个&符号来通过引用传递,以便您可以编辑值。

    所以在 left_side 或 left_side2 里面你会有:

    b($lang);
    

    和 b 将是:

    function b(&$lang){...}
    

    关于变量范围的进一步定义check this out

    【讨论】:

    • 好吧,如果我要这样做,编辑这些文件需要进行大修,所以恐怕这不太可行。但是,为了缓解奇怪的$GLOBALS['array']['property'] 语法问题,我可以在每个函数的顶部定义global $lang,然后正常访问$lang(如您的链接所示,谢谢)。是一种方式比另一种方式更好,还是它们在性能方面都相同?
    • 我没有运行任何测试来确定,但我想差异将是微不足道的,因为它们都在调用现有变量的全局引用(而不是实例化新副本)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-12-08
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多