0

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

例如: $var = class::get('id'); 将运行检查 $_GET 中是否有指针 id,根据参数返回字符串或数组。这也应该适用于发布和请求,甚至更多。

我正在按照所有超全局变量的功能进行操作。我以 get 为例:

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

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

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

我尝试了 $method = eval($method),但没有成功。($method = "$_GET"),有什么建议吗?

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

所以很简单

$X = $_GET 如果 X 的值为 "$_GET"

$X = $_POST 如果 X 的值为 "$_POST"

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

4

5 回答 5

2

根据手册中的这个页面

注意:变量变量

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

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

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

与其将字符串传递给fetchdata(),你能不传递$_GET自己吗?我认为 PHP 不会复制一个变量,除非你修改它('写时复制'),所以这不应该不必要地使用内存。

否则只有九个超全局变量,因此您所建议的 switch-case 并非不合理。

eval()如果你真的必须这样做,你可以这样做,比如:

eval('return $_GET;');

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

于 2009-04-14T14:39:06.257 回答
2

不要使用评估。只是使用参考。

//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。

参数顺序:我总是尽可能将必需参数放在可选参数之前,并将数据对象放在操作/主观参数之前。这就是为什么 key 是 superglobalValue 的第一个参数和 getArrayValue 的第二个参数。

于 2009-04-14T17:00:54.543 回答
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};
于 2009-04-14T14:21:02.383 回答
0

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

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

$var = null;
if (isset($_GET["varname"]))
{
  $var = $_GET["varname"];
}
别的
{
  $var = $_POST["varname"];
}
于 2009-04-14T14:07:41.340 回答
-2

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

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

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

于 2009-04-14T14:11:54.683 回答