变量变量的意外行为

时间:2012-03-08 10:33:12

标签: php scope variable-variables

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

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

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

$sessName   = '_SERVER';

var_dump ($$sessName);

accessSession ($sessName);

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

向函数添加global $_SERVER并没有使错误消失,而是将$ _SERVER分配给另一个变量并使该变量全局起作用(见下文)

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

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

var_dump ($$sessName);

accessSession ($sessName);

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

4 个答案:

答案 0 :(得分:3)

PHP: Variable variables - Manual

  

警告

     

请注意,变量变量不能用于函数或类方法中的超全局数组 。变量$ 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');

答案 1 :(得分:2)

来自php.net

  

警告

     

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

答案 2 :(得分:-2)

答案很简单:从不使用变量 改为使用数组

(是的 - 你做错了。不,这不是PHP中的错误。)

答案 3 :(得分:-2)

使用$ GLOBALS。你去了:))

<?php

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

$sessName   = '_SERVER';

accessSession ($sessName);