【问题标题】:PHP $_GET/$_POST via variable variablesPHP $_GET/$_POST 通过变量变量
【发布时间】:2012-03-30 07:19:31
【问题描述】:

我正在尝试使用可变变量动态访问 $_GET 和 $_POST 数组等。我尝试这样做的原因是我可以在多个数组上执行类似的操作,而无需为每个数组声明特定的迭代。我有理由确定这是可能的,因为 PHP 的文档说它能够使用变量变量来动态访问数组,但是我无法让它工作。一个简单的演示是当我尝试验证某个属性是否已设置时。

if(isset(${$this->_array}[$property])) { return ${$this->_array}[$property]; }
else { return null; }

当我运行上面的脚本时,我总是得到 null,但是当我静态地寻找所需的属性时,手动使用 $_GET 或 $_POST,我得到了所需的结果。我对$this->_array$property 进行了三次检查,它们返回了正确的字符串值。这些数组是否无法进行此类访问,还是我做错了什么?

【问题讨论】:

  • @ceejayoz:好吗?之前听说过,熟悉了这个概念。你想说什么?我的代码在其他地方错了吗?我已经确定传递给上述语句的变量是正确的。不知道还有什么可能。
  • 我想说的是,使用可变变量通常表明你做错了什么。几乎总有更好的方法不会让后续开发者想要杀了你。
  • 好吧,我没有意识到变量变量这么禁忌,这是我第一次接触它们。我一定会把它们排除在未来的代码之外:)

标签: php variable-variables


【解决方案1】:

您可以创建一个引用这两个数组的关联数组,并使用它。

$params = [
    '_GET' => $_GET,
    '_POST' => $_POST
];

然后就可以使用了

return $params[$this->_array][$property] ?? null;

【讨论】:

    【解决方案2】:

    你可以这样做,但不知道这是否是一种好的编码习惯

    if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
         $method = '_POST';
     }
     else {
        $method = '_GET';
     }
     $data = $$method;
    

    【讨论】:

      【解决方案3】:

      超全局变量不能在类或方法中作为变量变量引用,所以这会起作用:

      <?php
      $var = "_GET";
      print_r(${$var});
      

      但这不会:

      <?php
      test();
      function test() {
        $var = "_GET";
        print_r(${$var});
      }
      

      我怀疑有更好的方法来做你想要完成的事情。

      http://php.net/manual/en/language.variables.superglobals.php#refsect1-language.variables.superglobals-notes

      【讨论】:

      • 即使这不起作用。我确实尝试只打印整个数组,忘记提及了。不过谢谢
      • 我的代码确实有效。我更新了我的答案以解释为什么它不适合你。
      【解决方案4】:

      超全局变量(如$_POSTcan not be used as variable variables within functions

      您可以说类似$post = $_POST; 的内容,然后使用'post',它会起作用,但直接使用'_POST' 则不行。

      【讨论】:

        【解决方案5】:

        无论您做错了什么,使用可变变量可能会使情况变得更糟。为了你自己的理智,请停下来。在任何情况下都不应将它们部署在生产代码中。它们无法调试,在代码中使用它们就像试图阅读别人用脚写的东西。如果他们的脚特别灵巧,那么也许您可以理解他们在做什么。但在 99.9999% 的情况下,最好只使用普通数组。

        话虽如此,请改用$_REQUEST

        【讨论】:

          【解决方案6】:

          你说你想访问both the $_GET and $_POST arrays, among others——这些“其他人”是什么?您可以使用$_REQUEST一次检查$_GET$_POST$_COOKIE的内容。

          【讨论】:

            【解决方案7】:

            已经有一个包含$_GET$_POST 的数组。它被命名为$_REQUEST。话虽如此,它也可以包含$_COOKIE 的内容,具体取决于request_order 设置,但默认只有$_GET$_POST

            【讨论】:

              猜你喜欢
              • 2016-06-29
              • 1970-01-01
              • 1970-01-01
              • 2016-11-26
              • 1970-01-01
              • 1970-01-01
              • 2013-05-15
              • 2020-02-21
              • 2011-07-06
              相关资源
              最近更新 更多