2

我应该直接叫他们的名字$_GET, $_POST, $_SESSION //etc,还是应该把他们包在一个班级里?例如对于 POST 超全局,如果未设置某个数组索引,它会返回 false 吗?

假设我有一个 Validator 类。所以我必须像这样遍历每个字段,$_POST['name']但如果没有设置它会返回一个未定义的索引错误。但是,如果它返回 false 则不会发生。

有没有使用超全局变量的首选方法或最佳实践?

4

2 回答 2

3

您可以创建一个输入类来处理这个问题。只是一个存根:

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);
   }
}
于 2014-05-07T20:22:52.763 回答
0

你可以有一个应用程序对象,并为它们分配超全局变量

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 分配给应用程序对象。

已编辑。添加了我为我的需要编写的请求类的一部分,感谢戴夫的评论。

赞成的问题。我也对替代解决方案感兴趣。

于 2014-05-07T20:06:09.800 回答