我应该直接叫他们的名字$_GET, $_POST, $_SESSION //etc
,还是应该把他们包在一个班级里?例如对于 POST 超全局,如果未设置某个数组索引,它会返回 false 吗?
假设我有一个 Validator 类。所以我必须像这样遍历每个字段,$_POST['name']
但如果没有设置它会返回一个未定义的索引错误。但是,如果它返回 false 则不会发生。
有没有使用超全局变量的首选方法或最佳实践?
我应该直接叫他们的名字$_GET, $_POST, $_SESSION //etc
,还是应该把他们包在一个班级里?例如对于 POST 超全局,如果未设置某个数组索引,它会返回 false 吗?
假设我有一个 Validator 类。所以我必须像这样遍历每个字段,$_POST['name']
但如果没有设置它会返回一个未定义的索引错误。但是,如果它返回 false 则不会发生。
有没有使用超全局变量的首选方法或最佳实践?
您可以创建一个输入类来处理这个问题。只是一个存根:
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);
}
}
你可以有一个应用程序对象,并为它们分配超全局变量
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 又快又脏。您希望每个模块/公式都有一个模块对象,您可以在其中将您的 PostBacks(即用户名、密码)如 Page 分配给应用程序对象。
已编辑。添加了我为我的需要编写的请求类的一部分,感谢戴夫的评论。
赞成的问题。我也对替代解决方案感兴趣。