首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP如何将字符串用作超全局

PHP如何将字符串用作超全局
EN

Stack Overflow用户
提问于 2009-04-14 14:00:02
回答 3查看 1.5K关注 0票数 0

我正在构建一个小的抽象类,它应该可以让某些任务变得更容易。

例如:$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获取与其值同名的数据。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-14 14:39:06

根据this page in the manual的说法

备注:变量

超全局变量不能用作函数或类方法中的变量。

这意味着你不能在一个函数或方法中这样做(你可以用其他变量来做到这一点):

代码语言:javascript
复制
$var = '_GET';
${$var}[$key]

可以不传递$_GET本身,而不是将字符串传递给fetchdata()吗?我认为PHP不会复制一个变量,除非你修改它(“写入时复制”),所以这不应该使用不必要的内存。

否则只有9个超全局变量,所以你所建议的切换情况并不是不合理的。

如果真的有必要,您可以使用eval()完成此操作,如下所示:

代码语言:javascript
复制
eval('return $_GET;');

我认为这是不必要的,也是一个坏主意;它很慢,你需要非常小心地让不受信任的字符串接近它。

票数 2
EN

Stack Overflow用户

发布于 2009-04-14 17:00:55

不要使用eval。只需使用引用即可。

代码语言:javascript
复制
//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是第二个参数。

票数 2
EN

Stack Overflow用户

发布于 2009-04-14 14:11:55

如果你希望一个变量可以全局访问,你可以将它添加到$GLOBALS数组中。

代码语言:javascript
复制
$GLOBALS['test']='test';

现在,您可以在任何地方获取$GLOBALS['test']

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/747686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档