【问题标题】:Error using $_SERVER in a variable variable (PHP)在变量变量中使用 $_SERVER 时出错 (PHP)
【发布时间】:2011-07-11 06:47:40
【问题描述】:

我试图通过 GET 参数获取超全局变量的名称。我被告知在获取请求中只传递_VAR_NAME(没有$),所以在程序中我必须通过一个变量变量来访问它:$$_GET['parameter_name']

除了$_SERVER,一切都很好。为了尝试出了什么问题,我只是做了一个小 php 脚本来测试发生了什么。代码如下:

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

_SERVER 版本不起作用有什么原因吗? 我收到以下错误:

注意:未定义变量:_SERVER in ...

【问题讨论】:

  • 您确定建议是让超全局可引用吗?这似乎很奇怪。通常你最多只能使用数组索引来做到这一点。
  • 你有哪个php版本?在cli上运行?建议:在你的代码中始终使用英文
  • phpinfo() 报告:PHP 版本 5.3.3-1ubuntu9.3
  • 似乎服务器中发生了一些事情,因为我可以毫无问题地在其他服务器上运行脚本。我会联系服务器管理员。

标签: php superglobals


【解决方案1】:

启用auto_globals_jit 指令后,SERVER 和 ENV 变量会在首次使用时创建(及时),而不是在脚本启动时创建。 PHP Manual 警告变量变量:

在编译期间检查 SERVER 和 ENV 变量的使用情况 所以通过例如使用它们变量变量不会导致它们的 初始化

可能的解决方案是:

  • 使用 PHP 函数 getenv() 代替 SERVER 变量。
  • 仅在脚本之前或开头添加行 $_SERVER;
  • 禁用指令(在 php.ini 中:auto_globals_jit = Off,或在脚本中:ini_set('auto_globals_jit',0);
  • 使用数组 $GLOBALS ($GLOBALS['_SERVER']) 中的键“_SERVER”

【讨论】:

    【解决方案2】:

    它对我来说非常适合。你试过 print_r ($_SERVER)

    它可能未在您的系统中填充。

    确保您没有在脚本中的某处取消设置。


    你是在函数还是类中使用它?

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

    你最好的选择是 switch 语句。

    【讨论】:

    • 我刚刚在脚本末尾添加了您的代码行,这使代码正常工作。我还尝试了马里奥的技巧添加计数($_SERVER),它也有效。所以似乎该变量未设置。我自己没有取消它,也不明白这个问题。可能会发生什么?
    • 它不在任何函数或类中。我在另一台服务器上试过,它可以工作,所以似乎与服务器配置有关。
    • 嗯好吧服务器特定的。祝你好运。我建议您尝试使用超全局变量的开关并将默认情况设置为使用其他变量的变量变量。
    【解决方案3】:

    您可以尝试替代语法:

    $var = $GLOBALS["_SERVER"];
    print_r($var);
    

    这在功能上等同于$$varvar

    要检查的更关键的事情是$_SERVER 本身是否存在。 (如果没有,请在脚本开头放置一个空的 count($_SERVER); 表达式。)

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

    【讨论】:

    • 为什么添加任何对 $_SERVER (例如count($_SERVER) 的直接引用会使代码开始正常工作?
    • @DavidCasillas:请注意,但我读过超全局变量有时会在首次访问时初始化(取决于 SAPI)。 - 但我认为您的实际问题可能是您在本地范围内尝试了$$SERVER。超全局变量 ($_SERVER) 并不是真正的超全局变量,而只是隐含的全局变量。 $$varvar 没有引用真正的$_SERVER,而只是一个本地数组,如果它之前没有被显式访问过。 简而言之:$$SERVER varvar 仅适用于全局范围。 无论如何,为了安全起见,请使用 $GLOBALS[_serv]
    【解决方案4】:

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

    你可以根据你的 $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";
    }
    

    【讨论】:

    • 好的,感谢您的建议。但这对我来说也很重要,我试图了解发生了什么问题并了解 php 的内部。不仅仅是找到新的解决方法。
    • @David Casillas,我不确定您的示例中的变量变量有什么问题。但是如果你想在 php 中变得更好,使用可变变量不是办法。代码变得更难阅读和调试,并且有时容易出现安全风险。仅仅因为 php 有这个功能并不意味着它很好。但这只是我的拙见,请使用适合您的方法;)
    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 2023-04-04
    • 2018-02-23
    • 2015-04-26
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多