PHP如何使用字符串作为超全局

时间:2009-04-14 14:00:02

标签: php string superglobals

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

例如: $ var = class :: get('id'); 将运行检查$ _GET中是否有指针ID,根据参数返回字符串或数组。这应该适用于帖子和请求以及maby。

我正在以所有超级球的功能的方式进行。我用get作为例子:

get function获取指针作为参数,它调用fetchdata函数并使用指针和“$ _GET”作为参数。

fetchdata应该盲目地使用它作为超全局的字符串,并指向另一个参数。然后检查它是否存在并返回值或false来获取函数,它将值/ false返回给调用者。

唯一的问题是当你不知道它是什么时,让字符串作为超全局工作。我之前用一个检查参数的开关做了这个,如果它是“get”,它将$ _GET设置为另一个变量的值。但是我不想这样做,我希望在不必触摸fetchdata的情况下轻松添加更多功能。

我尝试了$ method = eval($ method),但它没有用。 ($ method =“$ _GET”),有什么建议吗?

编辑:对不起,如果我说得不够清楚的话。我有一个带字符串值“$ _GET”的变量X,我怎样才能使它从字符串中描述的源中获取值?

所以简单就是

$ X = $ _GET如果X的值为“$ _GET”

$ X = $ _POST如果X的值为“$ _POST”

我只是不知道X有什么价值,但它需要从超全局获取与其值相同的数据。

5 个答案:

答案 0 :(得分:2)

根据this page in the manual

  

注意:变量

     

Superglobals不能用作函数或类方法中的变量变量。

这意味着不能在函数或方法中执行此操作(您可以使用其他变量执行此操作):

$var = '_GET';
${$var}[$key]

不是将字符串传递给fetchdata(),而是不能自己传递$_GET?我认为PHP不会复制变量,除非你修改它('copy on write'),所以这不应该不必要地使用内存。

否则只有九个超长球,所以你所建议的开关盒并非不合理。

如果您真的需要,可以使用eval()执行此操作,例如:

eval('return $_GET;');

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

答案 1 :(得分:2)

不要使用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命令:我总是把可选的params放在可选之前,当我可以,并且数据对象在操作/主观参数之前。这就是为什么key是superglobalValue的第一个参数和getArrayValue的第二个参数。

答案 2 :(得分:1)

我不太确定你想要实现的目标,但你可以看一下__callStatic魔术方法

class example{
 protected static $supers = array('GET', 'POST', 'SERVER', 'COOKIE');
 public static function __callStatic($functionName, $arguments){
  $index = arguments[0];
  $desiredSuper = strtoupper($functionName);
  if(in_array($desiredSuper, self::$supers)){
   doStuff ( $_{$desiredSuper}[$index] );
  }
  else{
    throw new Exception("$desiredSupper is not an allowed superGlobal");
  }
 }
} 
然后你可以这样做:

 example::get('id'); //wo do stuff to $_GET['id']
 example::server('REQUEST_METHOD'); //Will do stuff to $_SERVER['REQUEST_METHOD']
 example::foo('bar'); //throws Exception: 'FOO is not an allowed superGlobal'

关于魔法的Php手册:http://ca.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

修改
我刚注意到你的编辑,你可以尝试:

 $X  = {$X};

答案 3 :(得分:0)

您可以使用$ _REQUEST [“var”]代替$ _GET [“var”]或$ _POST [“var”]。

更复杂的方法是测试变量是否存在于GET数组中,如果它不存在于POST中。如果它做了它的GET。

$var = null;
if (isset($_GET["varname"]))
{
  $var = $_GET["varname"];
}
else
{
  $var = $_POST["varname"];
}

答案 4 :(得分:-2)

如果您希望全局访问变量,可以将其添加到$GLOBALS数组中。

$GLOBALS['test']='test';

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