4

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

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

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

4

7 回答 7

7

超全局变量(例如$_POST不能用作函数内的变量变量

你可以说类似$post = $_POST;然后使用'post'它会工作,但直接使用'_POST'不会。

于 2012-03-13T20:39:07.633 回答
4

超全局变量不能作为类或方法内部的变量变量引用,因此这将起作用:

<?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

于 2012-03-13T20:40:37.507 回答
3

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

话虽如此,不如试试$_REQUEST

于 2012-03-13T20:38:58.210 回答
2

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

于 2012-03-13T20:37:36.057 回答
0

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

于 2012-03-13T20:38:45.817 回答
0

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

if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
     $method = '_POST';
 }
 else {
    $method = '_GET';
 }
 $data = $$method;
于 2013-03-12T12:47:34.837 回答
0

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

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

然后你可以使用

return $params[$this->_array][$property] ?? null;
于 2021-05-06T15:59:02.973 回答