【发布时间】:2010-08-24 16:08:48
【问题描述】:
作为一名 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's answer,这是我将要使用的最终代码:
function isset_and_is ($superglobal, $key, $value)
{
$ref =& $GLOBALS['_' . strtoupper($superglobal)];
return isset($ref[$key]) && $ref[$key] == $value;
}
【问题讨论】:
-
第一个样本有什么问题?
-
IMO 第一个示例更清晰、更干、更容易让任何了解 PHP 的人理解。而其他的......
-
NullUserException: 有效点,但我是唯一使用此代码的人,除非您也想使用它。
-
好吧,如果你想给你的代码引入不必要的复杂性和开销,我能拒绝你吗? ;-)
标签: php superglobals