在课堂上包裹超级全球?

时间:2014-05-07 20:00:00

标签: php oop superglobals

我应该用他们的名字$_GET, $_POST, $_SESSION //etc来打电话给他们,还是应该把它们包在课堂上?例如对于POST超全局,如果未设置某个数组索引,则返回false?

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

使用超全球有什么首选方式或最佳做法吗?

2 个答案:

答案 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问题。我也对替代解决方案感兴趣。