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;
}