我应该使用PHP Superglobals还是Filter输入来检索$\u GET数据?

我应该使用PHP Superglobals还是Filter输入来检索$\u GET数据?,php,superglobals,Php,Superglobals,我真的很讨厌全局变量——也许是我身上的C#程序员,但当我在PHP中工作时,每当我必须做这样的事情时,我都会咬紧牙关: $strUsername = $_GET['username']; 是的,我把它过分简化了,是的,是的,我对所有这些都进行了适当的消毒。事实上,对于我构建的框架,所有的超全局变量几乎都是在执行的开始就被抓取的,并且从那时起就被注入依赖项 我在PHP手册中遇到了这个函数(您每天都能真正学到一些新东西):filter\u input\u array() 所以现在,从技术上讲,我可以

我真的很讨厌全局变量——也许是我身上的C#程序员,但当我在PHP中工作时,每当我必须做这样的事情时,我都会咬紧牙关:

$strUsername = $_GET['username'];
是的,我把它过分简化了,是的,是的,我对所有这些都进行了适当的消毒。事实上,对于我构建的框架,所有的超全局变量几乎都是在执行的开始就被抓取的,并且从那时起就被注入依赖项

我在PHP手册中遇到了这个函数(您每天都能真正学到一些新东西):filter\u input\u array()

所以现在,从技术上讲,我可以做到这一点,而不是从GET superglobal获取一切:

$GETdata = filter_input_array(INPUT_GET);
。。。。我的问题是:我应该使用filter\u input\u数组来避免超全局的灾难,还是有理由坚持使用它们而忘记使用filter\u input函数?其他人对此有何经验


编辑:我忘了一件事-过滤器输入函数对您对超全局的脚本级修改视而不见,因此如果我这样做:
$\u GET['cheese']='puff'尝试执行
过滤输入(输入获取“奶酪”)
later将返回null。这很好,因为我注入了所有依赖项,但如果有人不知道,它可能会让他们措手不及。

我也非常讨厌这些全局变量。我肯定会使用
filter\u input\u array
并在需要时使用该数组。这解决了许多与全局相关的错误,并防止您花费数小时调试这些难以找到的全局错误


我认为,
过滤器\输入\阵列
就是wtg

为什么全局变量不好

常见的论点是,因为您将不必要的依赖关系引入外部状态

你的解决方案并不能阻止它,它只是隐藏了它

更好的解决方案是,imho,提供$\u GET作为参数,如

function myController($get) {
   $user = Model::get_user($get['userid']);
   render_view('user.html', $user);
}

myController($_GET)

这就解决了全局变量被认为是不好的原因。

使用filter\u input\u数组仍然使用超全局变量,因为它仍然从一个超全局数组获取数据

从这些阵列中获取数据并没有什么错,这实际上是获取数据的唯一方法。你只要确保不管你用它做什么,你都能逃脱它


html的htmlentities、pdo的prepared string、mysql的mysql\u real\u escape\u string、mysql的函数等等。

我使用PHP superglobals,但仅在我的框架中的库级别使用。这是一个所有控制器都可以访问请求对象的框架,而请求对象又可以访问超全局对象。这允许您通过使用测试参数填充模拟请求对象来为控制器编写测试。这都是关于好的OO设计和好的设计模式


在没有任何抽象的情况下直接访问超全局是一种反模式。

我认为没有人知道完美的答案:)

有时我使用它,有时我获取数据就像
$\u get['data']
,有时我甚至使用
import\u request\u variables()


在一些项目中,我有一个特殊的类,它处理
POST
GET
REQUEST
,并执行类似的操作:
POST::getValue('username')
GET::getValue('session_id')
COOKIE::getValue('last_time_seen')

如果你真的不喜欢超全局,为什么不在这里编写你自己的清理实现,比如vB\u Input\u Cleaner类


几年前,情况更糟,URL中的参数&x=显示为global$x。Amyway,如果您不使用$\u GET,除了在框架中,它就不存在。

从性能的角度来看,您真的想在每次需要时过滤输入吗?e、 你调用
foo()
并在那里对它们进行消毒,但是如果
bar()
也需要它们呢?你会重新清理吗?如果你不需要任何过滤,为什么还要麻烦一个无意义的函数调用呢?超全局函数的存在是有原因的。你可能会想知道它们有什么好处,但在你遇到一个问题,它们实际上非常有用之前,你可能会对它们皱眉,并试图通过创建包装器来创建另一个数组来避免它们。难道“超级地球的祸害”不是有点戏剧性吗?:]@BradChristie&@zerkms-我的问题不是关于过滤、消毒、验证或其他什么。首先,在注入依赖项之后,最初获取GET和POST数据。模型处理自己的验证和过滤,视图处理清理输出。除了仇恨,还有什么意义?在什么情况下,与全局变量等价的statement比全局变量更好?在这种情况下,您不会用杂乱的全局变量污染您的主作用域,只将其替换为一个全局变量,从而将代码复杂性降至最低。无论如何,我喜欢你的方法。小心
$\u服务器
过滤输入数组(输入服务器)
。它们不会返回相同的输出。是的,这叫做
依赖项注入
。为了稍微改进代码,可以将
$get
重命名为类似
$request
的名称。我只是写了下来,我甚至不记得PHPs命名约定,因为我把它留给了sweet python:)。也许还有一个有趣的搜索术语:德米特定律。我在最初的问题中提到,一切都是依赖注入的。没有什么比在类方法中跑过浮标$GET更让我兴奋了。是的,我意识到我只是在隐藏这个问题。@jarrod-那么,为什么你要用一个等价的语句来替换$\u-GET,而不是将所说的代码移到你的框架中使用的上级样式呢?不幸的是,
import\u-request\u-variables()
现在已经被弃用了,尽管你仍然可以使用
extract($\u-GET)
做同样的事情。不完全是,