作为一名 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
}
我的问题:有没有办法像我在第二个代码示例中尝试做的那样动态访问超全局变量?如果没有,是否有更好/更有效的方法来完成我在第三个代码示例中所做的事情?
我的解决方案:感谢Tom Haigh 的回答,这是我将使用的最终代码:
function isset_and_is ($superglobal, $key, $value)
{
$ref =& $GLOBALS['_' . strtoupper($superglobal)];
return isset($ref[$key]) && $ref[$key] == $value;
}