我正在构建一个小型抽象类,它应该可以让某些任务变得更容易。
例如: $ 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有什么价值,但它需要从超全局获取与其值相同的数据。
答案 0 :(得分:2)
注意:变量
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']
。