【问题标题】:PHP Global Comportement On IterationPHP 全局迭代功能
【发布时间】:2021-04-29 04:41:23
【问题描述】:

我目前正在尝试一个奇怪的行为,同时在一个全局变量上迭代另一个全局变量,并获取它的值

这段代码

$lang_list = array('fr_FR', 'en_US');
$GLOBALS['lang_list'] = $lang_list;
if(isset($_GET['lang']) && in_array($_GET['lang'], $lang_list)){
    $GLOBALS['lang'] = $_GET['lang'];
}else{
    $GLOBALS['lang'] = 'en_US';
}

var_dump($GLOBALS['lang']);
foreach($GLOBALS['lang_list'] as $lang){
    var_dump($GLOBALS['lang']);
}

返回string(5) "en_US" string(5) "fr_FR" string(5) "en_US"

这是由于与全局有关的事情吗?

编辑: 谢谢大家的解释! :)

【问题讨论】:

  • 无法重现。我总是得到相同的值。

标签: php globals


【解决方案1】:

$GLOBALS['lang'] 指的是与$lang 相同的变量。来自manual page for $GLOBALS

一个关联数组,包含对当前在脚本全局范围内定义的所有变量的引用。变量名是数组的键。

因此,当您在全局范围内更改$lang 时,它也会更改$GLOBALS['lang'](反之亦然,如果您更改$GLOBALS['lang'],它也会更改$lang)。因此,在您的 foreach 循环中,$GLOBALS['lang'] 依次分配来自 $GLOBALS['lang_list'] 的值。

请注意,如果您在函数中运行此代码,您会得到预期的结果,因为在这种情况下,$lang 将定义在函数范围内,而不是全局范围内:

function test() {
    foreach($GLOBALS['lang_list'] as $lang){
        var_dump($GLOBALS['lang']);
    }
}

test();

输出:

string(5) "en_US"
string(5) "en_US"

Demo on 3v4l.org

【讨论】:

    【解决方案2】:

    是的,这是预期的行为。 $GLOBALS['lang'] 指的是全局范围内的$lang 变量。而且 PHP 中只有两个作用域:全局作用域和局部函数作用域(详情请参阅this answer)。

    由于foreach 循环不会创建局部函数作用域,所以$lang 变量属于全局作用域。因此,$lang$GLOBALS['lang'] 都引用同一个变量。

    【讨论】:

      【解决方案3】:

      请阅读https://www.php.net/manual/en/reserved.variables.globals.php 手册。您在上面的代码中引用了相同的值。

      【讨论】:

        猜你喜欢
        • 2014-06-29
        • 2021-11-27
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 2014-07-16
        相关资源
        最近更新 更多