Php 使用${$varname}动态访问_POST和_GET
[最后编辑] 似乎我错过了变量PHP手册中包含的一个重要警告 : 请注意,变量不能在函数或类方法中与PHP的超全局数组一起使用。变量$this也是一个特殊变量,不能动态引用 [原问题] 我在尝试设置/获取html/服务器变量$\u POST、$\u get、$\u SESSION等时遇到问题。。动态使用变量保存其名称:Php 使用${$varname}动态访问_POST和_GET,php,variables,post,dynamic,get,Php,Variables,Post,Dynamic,Get,[最后编辑] 似乎我错过了变量PHP手册中包含的一个重要警告 : 请注意,变量不能在函数或类方法中与PHP的超全局数组一起使用。变量$this也是一个特殊变量,不能动态引用 [原问题] 我在尝试设置/获取html/服务器变量$\u POST、$\u get、$\u SESSION等时遇到问题。。动态使用变量保存其名称: // Direct name ${'_GET'}['test'] = '1'; // Variable-holded name $varname = '_GET'; ${$va
// Direct name
${'_GET'}['test'] = '1';
// Variable-holded name
$varname = '_GET';
${$varname}['test'] = '2';
echo "value is " . $_GET['test'];
将输出:
值为1
知道为什么吗
[编辑1]
这就是我想这样使用它的原因:
class Variable {
protected static $source;
public function __get($key) {
// Some validation / var manip needed here
if ( isset( ${self::$source}[$key] ) ) {
return ${self::$source}[$key];
}
}
public function __set($key, $value) {
// Some validation / var manip needed here too
${self::$source}[$key] = $value;
}
}
final class Get extends Variable {
use Singleton;
public static function create() {
parent::$source = "_GET";
}
}
final class Post extends Variable {
use Singleton;
public static function create() {
parent::$source = "_POST";
}
}
final class Session extends Variable {
use Singleton;
public static function create() {
parent::$source = "_SESSION";
}
}
实例化时,在单例构造函数中调用create
[编辑2]使用PHP 5.4.3,您可能正在查找变量。摘自PHP.net:
<?php
$a = 'hello';
?>
<?php
$$a = 'world';
?>
<?php
echo "$a ${$a}";
//returns: hello world
//same as
echo "$a $hello";
?>
编辑
php.net上的另一个用户有您的确切问题。这是他的答案
<?php
function GetInputString($name, $default_value = "", $format = "GPCS")
{
//order of retrieve default GPCS (get, post, cookie, session);
$format_defines = array (
'G'=>'_GET',
'P'=>'_POST',
'C'=>'_COOKIE',
'S'=>'_SESSION',
'R'=>'_REQUEST',
'F'=>'_FILES',
);
preg_match_all("/[G|P|C|S|R|F]/", $format, $matches); //splitting to globals order
foreach ($matches[0] as $k=>$glb)
{
if ( isset ($GLOBALS[$format_defines[$glb]][$name]))
{
return $GLOBALS[$format_defines[$glb]][$name];
}
}
return $default_value;
}
?>
您可能正在寻找变量。摘自PHP.net:
<?php
$a = 'hello';
?>
<?php
$$a = 'world';
?>
<?php
echo "$a ${$a}";
//returns: hello world
//same as
echo "$a $hello";
?>
编辑
php.net上的另一个用户有您的确切问题。这是他的答案
<?php
function GetInputString($name, $default_value = "", $format = "GPCS")
{
//order of retrieve default GPCS (get, post, cookie, session);
$format_defines = array (
'G'=>'_GET',
'P'=>'_POST',
'C'=>'_COOKIE',
'S'=>'_SESSION',
'R'=>'_REQUEST',
'F'=>'_FILES',
);
preg_match_all("/[G|P|C|S|R|F]/", $format, $matches); //splitting to globals order
foreach ($matches[0] as $k=>$glb)
{
if ( isset ($GLOBALS[$format_defines[$glb]][$name]))
{
return $GLOBALS[$format_defines[$glb]][$name];
}
}
return $default_value;
}
?>
为什么不直接使用$\u请求,其中包括$\u GET、$\u POST和$\u COOKIE?还是我误解了目的?为什么不直接使用$\u请求,其中包括$\u GET、$\u POST和$\u COOKIE?还是我误解了目的?我猜这与你不应该那样给$赋值有关。不管怎么说,这很管用:
$source = '_GET';
echo ${$source}['test'];
// URL: http://domain.com/thing.php?test=yes
// output: "yes"
编辑
巧合的是,今天我回去更新了一些旧代码,看起来我正试图在一个类中实现它,但它不起作用。我相信在尝试通过变量访问超全局之前使用global
关键字也会解决您的问题
Class MyExample {
private $method = '_POST';
public function myFunction() {
echo ${$this->method}['index']; //Undefined index warning
global ${$this->method};
echo ${$this->method}['index']; //Expected functionality
}
}
我猜这与你不应该像那样给$\u GET
赋值有关。不管怎么说,这很管用:
$source = '_GET';
echo ${$source}['test'];
// URL: http://domain.com/thing.php?test=yes
// output: "yes"
编辑
巧合的是,今天我回去更新了一些旧代码,看起来我正试图在一个类中实现它,但它不起作用。我相信在尝试通过变量访问超全局之前使用global
关键字也会解决您的问题
Class MyExample {
private $method = '_POST';
public function myFunction() {
echo ${$this->method}['index']; //Undefined index warning
global ${$this->method};
echo ${$this->method}['index']; //Expected functionality
}
}
为什么要设置请求变量的值????它们不是为此而设计的。:)如果您不知道是使用GET还是POST,可以使用以下命令:$var=empty($\u POST)$_获取:$\u POST
然后使用$var
。除了不可靠地获取请求变量之外,您的代码对我来说运行得非常好:)@fedorqui,甚至还有一个缩写,叫做$\u request
。嗯,它实际上不仅仅是这样。。。但99.9%的情况下,您没有通过get、post和cookie传递相同的变量,对吗?:)是的,对@J0HN!几天前我发现了$\u REQUEST
,但我的大脑仍然没有缓存:)谢谢你突出显示它。你到底为什么要设置请求变量的值????它们不是为此而设计的。:)如果您不知道是使用GET还是POST,可以使用以下命令:$var=empty($\u POST)$_获取:$\u POST
然后使用$var
。除了不可靠地获取请求变量之外,您的代码对我来说运行得非常好:)@fedorqui,甚至还有一个缩写,叫做$\u request
。嗯,它实际上不仅仅是这样。。。但99.9%的情况下,您没有通过get、post和cookie传递相同的变量,对吗?:)是的,对@J0HN!几天前我发现了$\u REQUEST
,我的大脑仍然没有缓存:)谢谢你突出显示它。我是唯一一个觉得代码(1)难看,(2)不起作用的人吗?我是唯一一个觉得代码(1)难看,(2)不起作用的人吗。我将它与_会话一起使用,它不会添加/编辑任何值。@user1990715我想不出它不起作用的原因。如果你不能让它工作,你可能想考虑对它进行一个bug。这只适用于全局范围的IIRC。根据${}
本地作用域访问引用超全局变量会受到其他上下文中引用超全局变量的方式的阻碍。@mcNdave我已经用一些可以解决您问题的东西更新了我的答案。@Sammitch我已经用答案更新了我的原始问题,这根本不可能。您的解决方案可以与Get和Post配合使用,但是当您试图设置会话变量时,它不会更新会话本身。尽管如此,我还是可以用它来发布我的Get帖子和全球新闻,谢谢!是的,我让它工作,但我不能这样设置变量。我将它与_会话一起使用,它不会添加/编辑任何值。@user1990715我想不出它不起作用的原因。如果你不能让它工作,你可能想考虑对它进行一个bug。这只适用于全局范围的IIRC。根据${}
本地作用域访问引用超全局变量会受到其他上下文中引用超全局变量的方式的阻碍。@mcNdave我已经用一些可以解决您问题的东西更新了我的答案。@Sammitch我已经用答案更新了我的原始问题,这根本不可能。您的解决方案可以与Get和Post配合使用,但是当您试图设置会话变量时,它不会更新会话本身。尽管如此,我还是可以用它来发布我的Get帖子和全球新闻,谢谢!