在变量(PHP)中使用$\u服务器时出错

在变量(PHP)中使用$\u服务器时出错,php,superglobals,Php,Superglobals,我试图通过get参数获取超全局变量的名称。我被告知在get请求中只传递\u VAR\u NAME(不传递$),因此在程序中,我必须通过变量访问它:$\u get['parameter\u NAME'] 除了使用$\u服务器,一切都很顺利。为了尝试出错的地方,我只做了一个小的php脚本来测试发生了什么。代码如下: <?php // ¡¡ This does not work !! $nombre = "_SERVER"; $var = $$nombre

我试图通过get参数获取超全局变量的名称。我被告知在get请求中只传递
\u VAR\u NAME
(不传递
$
),因此在程序中,我必须通过变量访问它:
$\u get['parameter\u NAME']

除了使用
$\u服务器
,一切都很顺利。为了尝试出错的地方,我只做了一个小的php脚本来测试发生了什么。代码如下:

<?php
    // ¡¡ This does not work !!
        $nombre = "_SERVER";
        $var = $$nombre;
        print_r($var);
    // This works 
        $nombre = "_GET";
        $var = $$nombre;
        print_r($var);
?>

\u服务器
版本不工作有什么原因吗? 我得到以下错误:

注意:未定义的变量:
\u服务器


我不知道你为什么需要这个,我不使用变量(通常有更好的方法)

你可以根据$nombre变量做一个简单的切换,没有那么多超全局变量

switch ($nombre) {
  case "_SERVER" : 
    print_r($_SERVER);
    break;
  case "_GET" : 
    print_r($_GET);
    break;
  case "_POST" : 
    print_r($_POST);
    break;
  // ...
  default:
    echo "Unknown variable";
}

它在这里非常适合我。你试过打印吗 ($\u服务器)

可能没有在您的系统上填充它

确保没有在脚本中的某个位置取消设置它


您是在函数或类中使用它吗

警告指出,这不能用于函数或类中的超全局函数


最佳选择是switch语句。

您可以尝试其他语法:

$var = $GLOBALS["_SERVER"];
print_r($var);
这在功能上等同于
$$varvar

需要检查的另一个关键问题是
$\u服务器本身是否存在。(如果不是,请在脚本开头放置一个空的
计数($\u SERVER);
表达式。)


如果在
php.ini
中修改了它,则它可能不存在(尽管在最近的php版本中它实际上应该显示为空数组)。

当启用
auto\u globals\u jit
指令时,服务器和ENV变量将在首次使用时(及时)而不是在脚本启动时创建。关于变量的警告:

在编译时检查服务器和环境变量的使用情况 因此,通过变量使用它们不会导致 初始化

可能的解决办法是:

  • 使用PHP函数
    getenv()
    而不是服务器变量
  • 仅添加行
    $\u服务器在脚本开始之前或之前
  • 禁用指令(在php.ini中:
    auto\u globals\u jit=Off
    ,或在脚本中:
    ini\u set('auto\u globals\u jit',0);
  • 使用数组$GLOBALS中的键“\u SERVER”(
    $GLOBALS[''u SERVER']

您确定建议是使超全局引用?这似乎很奇怪。通常情况下,您最多只能使用数组索引。您有哪个php版本?是否正在cli上运行?建议:在codephpinfo()报告中始终使用英语:PHP版本5.3.3-1ubuntu9.3服务器中出现了一些问题,因为我可以在其他服务器上运行脚本,不会有问题。我将与服务器管理员联系。我刚刚在脚本末尾添加了您的代码行,这使代码正常工作。我还尝试了Mario的增加计数的技巧($\u服务器),它也很有效。因此,变量似乎未设置。我自己也没有解开,也不明白这个问题。可能会发生什么?它不在任何函数或类中。我已经在另一台服务器上试过了,它可以正常工作,所以这似乎和服务器配置有关。啊,好的,那个么服务器是特定的。祝你好运。我建议您尝试切换superglobals,并将默认情况设置为对其他变量使用变量变量。为什么添加对$\u服务器的任何直接引用(
count($\u SERVER
)例如)会使代码开始正常工作?@DavidCasillas:注意,当然可以,但我已经读到superglobals有时会在第一次访问时初始化(取决于SAPI)——但我认为您的实际问题可能是您在本地范围内尝试了
$$SERVER
。超全局(
$\u SERVER
)不是真正的超全局,而是隐式全局。
$$varvar
不引用真正的
$\u服务器
,而仅引用一个本地数组(如果它以前未被显式访问)。简言之,
$$SERVER
varvar只在全局范围内工作。无论如何,请使用
$GLOBALS[\u serv]
为了安全起见。好的,谢谢你的建议。但对我来说,试图弄清哪里出了问题并了解php的内部结构也很重要。不仅仅是找到一个新的解决方法。@David Casillas,我不确定你的示例中的变量出了什么问题。但是如果你想在php中做得更好,使用变量不是办法代码变得更难阅读和调试,有时容易出现安全风险。仅仅因为php有这种功能并不意味着它是好的。但这只是我的拙见,请使用适合您的工具;)