0

[最終編集]

Variables variable 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";
    }
}

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 に答える