7

Web 開発者として、ログイン フォームやその他の「保存」操作のようなものに対して、私は常にこのアプローチを使用しています (入力変数に直接アクセスする危険性は無視しています)。

if (isset($_POST['action']) && $_POST['action'] == 'login')
{
    // we're probably logging in, so let's process that here
}

これを退屈でなく、DRY の原則 (一種) に沿ったものにするために、私はこれを作成しました。

function isset_and_is ($superglobal, $key, $value)
{
    $ref = '_' . strtoupper($superglobal);

    return isset($$ref[$key]) && $$ref[$key] == $value;
}

if (isset_and_is('post', 'action', 'login'))
{
    // we're probably logging in, so let's process that here
}

スーパーグローバルにアクセスするために動的変数名を非常に巧妙に使用しているにもかかわらず、これは惨めに失敗します。

だから、私はこの醜いものを使って立ち往生しています:

function isset_and_is ($superglobal, $key, $value)
{
    switch (strtoupper($superglobal))
    {
        case 'GET':     $ref =& $_GET;     break;
        case 'POST':    $ref =& $_POST;    break;
        case 'REQUEST': $ref =& $_REQUEST; break;
        default:        die('megafail');   return;
    }

    return isset($ref[$key]) && $ref[$key] == $value;
}

if (isset_and_is('post', 'action', 'login'))
{
    // we're probably logging in, so let's process that here
}

私の質問: 2 番目のコード サンプルで試みているように、スーパーグローバル変数に動的にアクセスする方法はありますか? いいえの場合、3 番目のコード サンプルで行っていることを達成するためのより良い/より効率的な方法はありますか?


私の解決策: Tom Haigh's answer のおかげで、最終的なコードは次のとおりです。

function isset_and_is ($superglobal, $key, $value)
{
    $ref =& $GLOBALS['_' . strtoupper($superglobal)];

    return isset($ref[$key]) && $ref[$key] == $value;
}
4

5 に答える 5

3

あなたはこのようにそれを行うことができます:

function test($var) {
    //this 
    var_dump( $GLOBALS[$var] );

    //or this
    global $$var; //this is needed even for superglobals
    var_dump($$var);
}

test('_GET');

だからあなたはあなたの場合にこのようなものを使うことができます

function isset_and_is ($superglobal, $key, $value) {
    $var = '_' . $superglobal;
    return isset($GLOBALS[$var]) && ($GLOBALS[$var][$key] == $value);
}

$is_login = isset_and_is('GET', 'action', 'login');

または、参照によって変数を取得して使用することもできますisset()

function get_var(& $var) {
    if (isset($var)) {
        return $var;
    }
    return null;
}

//will not give you a notice if not set
$post_var = get_var($_POST['var']);

if (get_var($_GET['action']) == 'login') {
    //stuff
}
于 2010-08-24T16:12:27.420 に答える
2

1つのソースからのみフェッチする必要がある場合は、トムの回答を参照してください。

ただし、すべての変数に対してこれを実行している場合、つまり、データが2つのソースから取得できることを常に認めている場合、最良の代替策はそれらをマージすることです。

を使用することもできますが$_REQUEST、使用しないことをお勧めします。POSTおよびGETデータと見なされる順序はphp.ini構成可能であり、他のソースが含まれます。

次のようなことをします:

$data = array_merge($_GET, $_POST); //POST has precedence

次に、からデータを取得します$data

于 2010-08-24T16:15:29.960 に答える
1

どうですか:http ://www.php.net/manual/en/function.filter-input.php

function isset_and_is ($superglobal, $key, $value) {
  switch($superglobal) {
    case 'post':
      $type = INPUT_POST;
      break;
    case 'get':
      $type = INPUT_GET;
      break;
  }
  $var = filter_input($type,$key);
  if(is_null($var)) return false;
  return($var == $value);
}
于 2010-08-24T16:15:05.250 に答える
-1

$_REQUESTデフォルトでとの内容が含まれているのに$_GET$_POSTなぜswitch-caseが必要なのですか。これを直接使用して、以下を排除できます$superglobal

function isset_and_is ($key, $value)
{
    return isset($_REQUEST[$key]) && ($_REQUEST[$key] == $value);
}
于 2010-08-24T16:13:28.750 に答える