我正在构建一个小的抽象类,它应该可以让某些任务变得更容易。
例如:$var = class::get(' id ');将运行检查$_GET中是否有指针id,根据参数返回一个字符串或数组。这也应该适用于post、request和maby更多。
我是按照所有超全局变量的函数来做的。我使用get作为示例:
get函数获取一个指针作为参数,它调用fetchdata函数,并使用指针和"$_GET“作为参数。
fetchdata应该只是盲目地使用它作为超全局获取的字符串,并使用另一个参数指向它。然后检查它是否存在,并返回值或false来获取函数,这将返回值/false给调用者。
唯一的问题是当你不知道字符串是什么的时候,让它像超全局一样工作。我之前用一个开关检查了参数,如果它是"get",它会将$_GET设置为另一个变量的值。然而,我不想这样做,我想让添加更多函数变得容易,而不必接触fetchdata。
我尝试过$method = eval($method),但它不起作用。($method = "$_GET"),有什么建议吗?
编辑:如果我说得不够清楚,很抱歉。我有一个字符串值为"$_GET“的变量X,我怎样才能让它从字符串中描述的源中获取值呢?
所以简单来说就是
如果X具有值" $_GET“,则$X =$_GET
如果X具有值" $_POST“,则$X =$_POST
我只是不知道X有什么值,但它需要从superglobal获取与其值同名的数据。
发布于 2009-04-14 14:39:06
根据this page in the manual的说法
备注:变量
超全局变量不能用作函数或类方法中的变量。
这意味着你不能在一个函数或方法中这样做(你可以用其他变量来做到这一点):
$var = '_GET';
${$var}[$key]可以不传递$_GET本身,而不是将字符串传递给fetchdata()吗?我认为PHP不会复制一个变量,除非你修改它(“写入时复制”),所以这不应该使用不必要的内存。
否则只有9个超全局变量,所以你所建议的切换情况并不是不合理的。
如果真的有必要,您可以使用eval()完成此操作,如下所示:
eval('return $_GET;');我认为这是不必要的,也是一个坏主意;它很慢,你需要非常小心地让不受信任的字符串接近它。
发布于 2009-04-14 17:00:55
不要使用eval。只需使用引用即可。
//test value for cli
$_GET['test'] = 'test';
/**
* @link http://php.net/manual/en/filter.constants.php reuse the filter constants
*/
function superglobalValue($key, $input = null) {
if ($input === INPUT_POST)
$X = &$_POST;
else
$X = &$_GET;
return (isset($X[$key]) ? $X[$key] : false);
}
function getArrayValue(&$array, $key) {
return (array_key_exists($key, $array) ? $array[$key] : false);
}
//test dump
var_dump(
superglobalValue('test', INPUT_GET),
superglobalValue('test', INPUT_POST),
getArrayValue($_GET, 'test'),
getArrayValue($_POST, 'test')
);默认情况下,$_GET、$_POST和$_REQUEST没有任何空值,只有字符串或数组。所以我用isset代替了array_key_exists。
Param order:如果可以,我总是把required params放在optional参数之前,把数据对象放在操纵/主观参数之前。这就是为什么key对于superglobalValue是第一个参数,对于getArrayValue是第二个参数。
发布于 2009-04-14 14:11:55
如果你希望一个变量可以全局访问,你可以将它添加到$GLOBALS数组中。
$GLOBALS['test']='test';现在,您可以在任何地方获取$GLOBALS['test']。
https://stackoverflow.com/questions/747686
复制相似问题