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