0

[最终编辑]

似乎我错过了变量变量 PHP 手册 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";
    }
}

实例化时在单例构造函数中调用 create

[编辑 2] 使用 PHP 5.4.3

4

3 回答 3

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
    }
}
于 2013-02-25T17:00:40.473 回答
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; 
    } 
?>
于 2013-02-25T16:47:03.100 回答
0

为什么不直接使用包含 $_GET、$_POST 和 $_COOKIE 的 $_REQUEST?还是我误解了目的?

于 2013-02-25T16:50:04.477 回答