[最终编辑]
好像我一直在错过Variables变量PHP Manual中包含的重要警告 http://www.php.net/manual/en/language.variables.variable.php:
请注意,变量变量不能与函数或类方法中的PHP的超全局数组一起使用。变量$ this也是一个无法动态引用的特殊变量。
[原始问题]
我在尝试设置/获取html /服务器变量$ _POST,$ _GET,$ _SESSION等时遇到了一个问题。动态地使用变量来保存它的名字:
// 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";
}
}
在instanciated
时在单例构造函数中调用create[编辑2]使用PHP 5.4.3
答案 0 :(得分:2)
我猜这与你不应该像$_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
}
}
答案 1 :(得分:1)
您可能正在寻找变量变量。摘自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;
}
?>
答案 2 :(得分:0)
为什么不使用包含$ _GET,$ _POST和$ _COOKIE的$ _REQUEST?还是我误解了目的?