我应该使用PHP Superglobals还是过滤输入来检索$ _GET数据?

| 我真的很讨厌全局变量-也许是我自己的C#程序员,但是当我在PHP中工作时,每次需要执行以下操作时,我都会g之以鼻:
$strUsername = $_GET[\'username\'];
是的,我在很大程度上简化了它,是的,我对所有这些都进行了适当的消毒。实际上,对于我构建的框架而言,几乎所有超全局变量都几乎在执行开始时就被抓住,并从那里开始进行依赖注入。 我在PHP手册中遇到了这个功能(您每天都会真正学习到一些新知识):filter_input_array()。 因此,现在,从技术上讲,我可以执行此操作,而不是从GET superglobal中获取所有内容:
$GETdata = filter_input_array(INPUT_GET);
....依此类推,还有其他类似的东西,例如POST,REQUEST等。我的问题是:我应该使用filter_input_array以避免超级超人的祸害,还是有某些理由坚持使用它们,而忘记使用filter_input函数?其他人对此有何经验? 编辑:我忘记了一件事-filter_input函数对您对超全局变量所做的任何脚本级修改都是盲目的,所以如果我这样做:
$_GET[\'cheese\'] = \'puff\';
稍后再尝试
filter_input(INPUT_GET, \'cheese\');
将返回null。这很好,因为我依赖注入了所有内容,但是如果他们不知道,它稍后可能会使某人措手不及。     
已邀请:
使用filter_input_array仍在使用超全局变量,因为它仍从超全局数组之一获取数据。 从这些数组之一中获取数据没有错,这实际上是实际获取数据的唯一方法。您只需要确保在使用它的任何地方都逃脱了它。 用于html的html实体,用于pdo的准备字符串,用于mysql_函数的mysql_real_escape_String等...     
为什么全局变量不好? 常见的论点是,因为您将非必要的依赖关系引入了外部状态。 您的解决方案不会阻止这种情况,只会将其隐藏。 更好的解决方案是,恕我直言,提供$ _GET作为参数,如
function myController($get) {
   $user = Model::get_user($get[\'userid\']);
   render_view(\'user.html\', $user);
}

myController($_GET)
这样就解决了将全局变量视为错误的原因。     
我使用PHP超全局变量,但仅在框架的库级别使用。这是所有控制器都可以访问请求对象的框架,该对象又可以访问超全局变量。这样,您可以通过使模拟请求对象填充测试参数来为控制器编写测试。这都是关于良好的OO设计和良好的设计模式。 在没有任何抽象的情况下直接在任何地方访问超全局变量是一种反模式。     
我真的也讨厌那些全局变量。我肯定会使用
filter_input_array
并在需要时使用该数组。这样可以解决许多与全局相关的错误,并避免您花费大量时间调试这些难以找到的全局变量。 我认为
filter_input_array
是wtg!     
我认为没有人知道完美的答案:) 有时我使用它,有时候我得到的数据就像
$_GET[\'data\']
,有时我甚至使用
import_request_variables()
。 在某些项目中,我有一个特殊的类,该类处理
POST
GET
REQUEST
并执行以下操作:
POST::getValue(\'username\')
GET::getValue(\'session_id\')
COOKIE::getValue(\'last_time_seen\')
...     
如果您真的不喜欢超全局变量,为什么不在这里编写像vB_Input_Cleaner类这样的清洗实现呢? http://members.vbulletin.com/api/     
几年前情况更糟,URL中的参数&x =看起来像全局$ x。 Amyway,如果不使用$ _GET,除了在框架中,它不存在。     

要回复问题请先登录注册