作爲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