1

問題

したがって、$ _ REQUEST、$ _ POST、$ _ GET、または$_COOKIE配列からデータを取得して処理するこの関数があります。関数呼び出しからのみ使用する配列がわかります。簡略化された例:

function gg( $name, $type="_REQUEST" ) {
    return isset( $GLOBALS[$type][$name] ) ? $GLOBALS[$type][$name] : false;
}

そしてそれは次のような呼び出しに対して完全に機能します:

gg('var', '_GET');
gg('var2', '_POST');

しかし、次の場合に劇的に失敗します。

gg('var');
// or
gg('var', '_REQUEST');

私はこの問題を2行に単純化することができました:

print_r( $GLOBALS['_REQUEST'] ); // this line returns nothing...
print_r( $_REQUEST ); // ...UNLESS this line is present anywhere in the code

さて、私の明らかな質問は、この$_REQUEST配列を$GLOBALSに存在するように初期化する必要があるかどうかです。

追加情報:

php: 5.3.3-7
apache: 2.2.16

also I'm running on CGI/FastCGI

編集と解決策

1

ここにあるように、最も簡単な解決策は、php.iniを編集し、auto_globals_jitの値をオンからオフに変更することです。

auto_globals_jit Off

2

これの代わりに、ソースファイル内でini_set()を使用できますが、私には機能しませんでした...

ini_set("auto_globals_jit", "Off");

3

さらに別の解決策は、$_REQUESTを除くすべてに$GLOBALS配列を使用 $ _REQUEST要求の場合は$_REQUEST配列を直接呼び出すことです:D

if($type == "REQUEST") return $_REQUEST[$name];
else return ${"_".$type}[$name]; // or $GLOBALS["_".$type][$name] if previous won't work
4

3 に答える 3

1

セットアップでこれを複製できなかったため、CGIの問題である可能性がありますか?回避策として、次のようなことを行うことができます...

function gg( $name, $type="_REQUEST" ) {
    return isset( ${$type}[$name] ) ? ${$type}[$name] : false;
}

興味があるかもしれません:

PHP 5.4以降、$GLOBALSはジャストインタイムで初期化されます。これは、初期化のオーバーヘッドを回避できるため、$GLOBALS変数を使用しないという利点があることを意味します。http://www.php.net/manual/en/reserved.variables.globals.php

アップデート。投稿を参照してください:

変数変数を使用すると$_REQUESTが作成されませんか?

于 2011-12-22T12:49:07.780 に答える
1

ヒント:

function gg( $name, $type="_REQUEST" ) {
  if($type=="_REQUEST")return $GLOBALS[$name];
  return isset( $GLOBALS[$type][$name] ) ? $GLOBALS[$type][$name] : false;
}

私があなたのような機能を作ったら:

    function get_data($name)
    {
        if(isset($_GET[$name]))return $_GET[$name];
        if(isset($_POST[$name]))return $_POST[$name];
    }
于 2011-12-22T12:52:48.790 に答える
0

$ _REQUESTはすでにスーパーグローバルです。「つまり、スクリプト全体のすべてのスコープで使用できます。関数またはメソッド内でアクセスするために、グローバル$variableを実行する必要はありません。」

function gg( $name, $type="_REQUEST" ) {
  switch ($type) {
  case '_REQUEST':
    return $_REQUEST[$name];
    break;
  case 'GLOBALS':
    return $_GLOBALS[$name];
    break;
  //  etc...
  default
    return false;
}
于 2011-12-22T12:57:23.747 に答える