具有可变变量的意外行为

Unexpected behaviour with variable variables

提问人:GordonM 提问时间:3/8/2012 更新时间:3/8/2012 访问量:125

问:

我试图传递一个变量,其中包含我想要函数处理的超全局数组的名称,但我无法让它工作,它只会声称有问题的变量不存在并返回 null。

我已将测试用例简化为以下代码:

function accessSession ($sessName)
{
    var_dump ($$sessName);
}

$sessName   = '_SERVER';

var_dump ($$sessName);

accessSession ($sessName);

函数外部的var_dump返回 $_SERVER 的内容,如预期的那样。但是,函数中的var_dump会触发上述错误。

添加到函数中并没有使错误消失,但是将 $_SERVER 分配给另一个变量并使该变量全局确实有效(见下文)global $_SERVER

function accessSession ($sessName)
{
    global $test;
    var_dump ($$sessName);
}

$test       = $_SERVER;
$sessName   = 'test';

var_dump ($$sessName);

accessSession ($sessName);

这是PHP错误,还是我只是做错了什么?

PHP 范围 变量

评论


答:

-2赞 Your Common Sense 3/8/2012 #1

答案很简单:永远不要使用变量
请改用数组

(是的 - 你做错了什么。不,它不是PHP中的错误。

2赞 ghbarratt 3/8/2012 #2

来自 php.net

警告

请注意,变量变量不能与 PHP 的 函数或类方法中的超全局数组。变量 $this也是一个不能引用的特殊变量 动态。

3赞 Filip Roséen - refp 3/8/2012 #3

PHP: 变量 - 手册

警告

请注意,变量变量不能在函数或类方法中与 PHP 的超全局数组一起使用。变量 $this 也是一个不能动态引用的特殊变量。


解决 方案

function access_global_v1 ($var) {
  global    $$var;
  var_dump ($$var);
}

function access_global_v2 ($var) {
  var_dump ($GLOBALS[$var]);
}

$test = 123;

access_global_v1 ('_SERVER');
access_global_v2 ('test');
-2赞 jpic 3/8/2012 #4

使用$GLOBALS。你去吧:)

<?php

function accessSession ($sessName)
{
    var_dump ($GLOBALS[$sessName]);
}

$sessName   = '_SERVER';

accessSession ($sessName);