我应该用他们的名字$_GET, $_POST, $_SESSION //etc
来打电话给他们,还是应该把它们包在课堂上?例如对于POST超全局,如果未设置某个数组索引,则返回false?
假设我有一个Validator类。所以我必须遍历每个字段,如$_POST['name']
,但如果没有设置它将返回一个未定义的索引错误。但如果它会返回假而不会发生。
使用超全球有什么首选方式或最佳做法吗?
答案 0 :(得分:2)
您可以创建一个处理它的Input类。只是一个存根:
class Input
{
private $_post;
private $_get;
private $_session;
private $_server;
public function __construct()
{
$this->_post = $_POST;
$this->_get = $_GET;
// and so on
}
public function post($key = null, $default = null)
{
return $this->checkGlobal($this->_post, $key, $default);
}
public function get($key = null, $default = null)
{
return $this->checkGlobal($this->_get, $key, $default);
}
// other accessors
private function checkGlobal($global, $key = null, $default = null)
{
if ($key) {
if (isset($global[$key]) {
return $global[$key];
} else {
return $default ?: null;
}
}
return $global;
}
}
样本用法:
$input = new Input();
print_r($input->post()); // return all $_POST array
echo $input->post('key'); // return $_POST['key'] if is set, null otherwise
echo $input->post('key', 'default'); // return 'default' if key is not set
当然你需要进一步扩展,但这就是主意。
编辑:
如果感觉更好,可以将这部分作为请求处理程序的一部分:
namespace App;
use App\Input;
class Request
{
private $input;
public function __construct()
{
$this->input = new App\Input();
}
public function post($key = null)
{
return $this->input->post($key);
}
}
答案 1 :(得分:0)
您可以拥有一个应用程序对象,并为其分配Superglobals
class Request {
public static function GetUrlParameter($key, $default = '') {
return isset ($_GET[$key]) ? $_GET[$key] : $default;
}
}
$app = new Application();
$app->Page = Request::GetUrlParameter('page', 'home');
$app->PostBacks = $_POST;
$app->Render();
肯定的PostBacks很快而且很脏。您希望为每个模块/公式提供一个模块对象,您可以在其中将PostBack(即用户名,密码)(如Page)分配给应用程序对象。
编辑。添加了我为我的需求编写的请求类的一部分,感谢Dave的评论。
Upvoted问题。我也对替代解决方案感兴趣。