使用$ {$ varname}动态访问_POST和_GET

时间:2013-02-25 16:43:47

标签: php variables post dynamic get

[最终编辑]

好像我一直在错过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

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?还是我误解了目的?