【问题标题】:Accessing _POST and _GET dynamically using ${$varname}使用 ${$varname} 动态访问 _POST 和 _GET
【发布时间】:2013-02-26 05:45:10
【问题描述】:

[最终编辑]

似乎我错过了变量变量 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

【问题讨论】:

  • 为什么要设置请求变量的值????它们不是为此而设计的。 :)
  • 如果你不知道是使用GET还是POST,你可以使用这个:$var = empty($_POST) ? $_GET : $_POST;然后使用$var
  • 除了请求变量的狡猾获取之外,你的代码对我来说运行得很好:)
  • @fedorqui,甚至还有一个简写形式,称为$_REQUEST。好吧,它实际上不仅仅如此……但是 99.9% 的时间你不会通过 get、post 和 cookie 传递相同的变量,对吧? :)
  • 是的,没错@J0HN!几天前我发现了$_REQUEST,但我的大脑仍然没有它在缓存中:) 感谢您突出显示它。

标签: php variables post dynamic get


【解决方案1】:

我猜这与您不应该像这样为$_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
    }
}

【讨论】:

  • 是的,我让它工作了,但我不能这样设置变量。我将它与 _SESSION 一起使用,它不会添加/编辑任何值。
  • @user1990715 我想不出它不应该工作的原因。如果你不能让它工作,你可能需要考虑提交一个关于它的错误。
  • 这仅适用于全局范围 IIRC。每个 ${} 本地范围访问引用超全局变量受到在其他上下文中引用它们的方式的阻碍。
  • @mcNdave 我已经用可以解决您问题的内容更新了我的答案。
  • @Sammitch 我已经用答案更新了我原来的问题,这根本是不可能的。您的解决方案适用于 Get 和 Post,但是当您尝试设置 Session 变量时,它不会更新会话本身。不过,我可以将它用于我的 Get Post 和 Globals,谢谢!
【解决方案2】:

您可能正在寻找可变变量。取自 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; 
    } 
?>

【讨论】:

  • 我是唯一觉得代码 (1) 丑陋,(2) 行不通的人吗?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多