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