PHP $_GET/$_POST 通过变量变量

PHP $_GET/$_POST via variable variables

提问人:mseancole 提问时间:3/14/2012 更新时间:5/6/2021 访问量:1005

问:

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

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

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

php 变量

评论

3赞 ceejayoz 3/14/2012
en.wikipedia.org/wiki/Code_smell
0赞 mseancole 3/14/2012
@ceejayoz:好吗?以前听说过,熟悉了这个概念。你想说什么?我的代码在其他地方是错误的?我已经确定传递给上述语句的变量是正确的。不知道它还能是什么。
0赞 ceejayoz 3/14/2012
我想说的是,使用变量通常表明你做错了什么。几乎总有一种更好的方法不会让后续开发人员想要杀死你。
0赞 mseancole 3/14/2012
好吧,我没有意识到变量是如此的禁忌,这是我第一次体验它们。我一定会把它们排除在以后的代码:)

答:

2赞 Powerlord 3/14/2012 #1

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

0赞 kitti 3/14/2012 #2

你说你想访问——这些“其他人”是什么?可用于同时检查 、 和 所有内容。both the $_GET and $_POST arrays, among others$_REQUEST$_GET$_POST$_COOKIE

3赞 Cyclone 3/14/2012 #3

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

话虽如此,请尝试。$_REQUEST

7赞 cHao 3/14/2012 #4

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

你可以说这样的话,然后使用,它会起作用,但直接使用不会。$post = $_POST;'post''_POST'

4赞 jasonlfunk 3/14/2012 #5

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

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

评论

0赞 mseancole 3/14/2012
甚至当这不起作用时就不行了。我确实尝试过打印整个数组,忘了提到这一点。谢谢
0赞 jasonlfunk 3/14/2012
我的代码确实有效。我更新了我的答案,解释了为什么它对你不起作用。
0赞 pelister 3/12/2013 #6

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

if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
     $method = '_POST';
 }
 else {
    $method = '_GET';
 }
 $data = $$method;
0赞 Barmar 5/6/2021 #7

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

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

然后你可以使用

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