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

PHP如何使用字符串作为超全局,php,string,superglobals,Php,String,Superglobals,我正在构建一个小的抽象类,用来简化某些任务 例如: $var=class::get('id'); 将运行检查$\u GET中是否有指针id,并根据参数返回字符串或数组。这也应该适用于post和request,可能还有更多 我用所有超球函数的方式来做。我使用get作为示例: get函数获取一个指针作为参数,它调用fetchdata函数并使用指针和“$\u get”作为参数 fetchdata应该只是盲目地使用它作为超全局的字符串,并用另一个参数指向它。然后检查它是否存在,并返回value或fals

我正在构建一个小的抽象类,用来简化某些任务

例如: $var=class::get('id'); 将运行检查$\u GET中是否有指针id,并根据参数返回字符串或数组。这也应该适用于post和request,可能还有更多

我用所有超球函数的方式来做。我使用get作为示例:

get函数获取一个指针作为参数,它调用fetchdata函数并使用指针和“$\u get”作为参数

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

唯一的问题是,当您不知道字符串是什么时,让它以超全局的方式工作。我之前用一个开关检查了参数,如果它是“get”,它会将$\u get设置为另一个变量的值。然而,我不想这样做,我希望它可以很容易地添加更多的功能,而不必接触fetchdata

我尝试了$method=eval($method),但没有成功。($method=“$\u GET”),有什么建议吗

编辑:如果我说得不够清楚,我很抱歉。我有一个字符串值为“$\u GET”的变量X,我如何使它使X从字符串中描述的源中获取值

所以很简单

$X=$\u如果X有值“$\u GET”

$X=$\U POST,如果X的值为“$\U POST”

我只是不知道X的值是什么,但它需要从superglobal获取与它的值同名的数据。

您可以使用$\u REQUEST[“var”]而不是$\u get[“var”]或$\u POST[“var”]

更复杂的方法是测试GET数组中是否存在变量,如果不存在,则测试其POST。如果它真的成功了

$var = null; if (isset($_GET["varname"])) { $var = $_GET["varname"]; } else { $var = $_POST["varname"]; } $var=null; 如果(isset($\u GET[“varname”])) { $var=$\u GET[“varname”]; } 其他的 { $var=$\u POST[“varname”]; } 您可以使用$\u REQUEST[“var”]而不是$\u GET[“var”]或$\u POST[“var”]

更复杂的方法是测试GET数组中是否存在变量,如果不存在,则测试其POST。如果它真的成功了

$var = null; if (isset($_GET["varname"])) { $var = $_GET["varname"]; } else { $var = $_POST["varname"]; } $var=null; 如果(isset($\u GET[“varname”])) { $var=$\u GET[“varname”]; } 其他的 { $var=$\u POST[“varname”]; }
如果希望变量可以全局访问,可以将其添加到
$GLOBALS
数组中

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

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

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

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

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

我不太确定您想要实现什么,但您可以看看静态魔术方法

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手册:

编辑
我刚注意到您的编辑,您可以尝试:

 $X  = {$X};

我不太确定你想要实现什么,但是你可以看看静态魔术方法

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手册:

编辑
我刚注意到您的编辑,您可以尝试:

 $X  = {$X};
根据:

注:可变变量

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

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

您不能将字符串传递给
fetchdata()
,而是传递
$\u GET
本身吗?我认为PHP不会复制变量,除非您修改它(“写时复制”),所以这不应该不必要地使用内存

否则,只有九个超球,所以你所建议的开关情况并不是不合理的

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

eval('return $_GET;');
我认为这是不必要的,也是个坏主意;它很慢,您需要非常小心,不要让不受信任的字符串靠近它。

根据:

注:可变变量

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

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

您不能将字符串传递给
fetchdata()
,而是传递
$\u GET
本身吗?我认为PHP不会复制变量,除非您修改它(“写时复制”),所以这不应该不必要地使用内存

否则,只有九个超球,所以你所建议的开关情况并不是不合理的

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

eval('return $_GET;');

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

不要使用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')
);
$\u GET、$\u POST和$\u REQUEST在默认情况下没有任何空值,只有字符串或数组。所以我使用了isset,而不是数组


参数顺序:如果可以,我总是将必需参数放在可选参数之前,将数据对象放在操纵/主观参数之前。这就是为什么键是superglobalValue的第一个参数和getArrayValue的第二个参数。

不要使用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')
);
$\u GET、$\u POST和$\u REQUEST在默认情况下没有任何空值,只有字符串或数组。所以我使用了isset,而不是数组

参数顺序:如果可以,我总是将必需参数放在可选参数之前,将数据对象放在操纵/主观参数之前。这就是为什么键是superglobalValue的第一个参数和getArrayValue的第二个参数