作为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;
}
第一个样品有什么问题? – NullUserException 2010-08-24 16:14:32
NullUserException:DRY :) – 2010-08-24 16:17:24
IMO的第一个示例更清晰,DRYer,并且对于任何知道PHP的人都很容易理解。而其他的... – NullUserException 2010-08-24 16:18:38