Как веб-разработчик, я всегда использую этот подход к чему-то вроде формы входа или другой операции «сохранить» (игнорируя опасность прямого доступа к входным переменным):
if (isset($_POST['action']) && $_POST['action'] == 'login')
{
// we're probably logging in, so let's process that here
}
Чтобы сделать это менее утомительным и соответствовать принципам СУХОЙ (вроде), я приготовил это:
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
}
Мой вопрос: Есть ли способ динамического доступа к суперглобальным переменным, как я пытаюсь сделать во втором примере кода? Если нет, есть ли лучший / более эффективный способ выполнить то, что я делаю в третьем примере кода?
Мое решение: Благодаря Ответ Тома Хейя , вот окончательный код, с которым я собираюсь пойти:
function isset_and_is ($superglobal, $key, $value)
{
$ref =& $GLOBALS['_' . strtoupper($superglobal)];
return isset($ref[$key]) && $ref[$key] == $value;
}