我真的讨厌全局变量 - 也许是我的C#程序员,但是当我在PHP工作时,每次我必须做这样的事情时我都会咬牙切齿:
$strUsername = $_GET['username'];
是的,我非常简单化,是的,我正确地清理了所有这些。实际上,对于我构建的框架,所有的超级全局都在执行开始时被抓取,并从那里开始依赖注入。
我在PHP手册中遇到过这个函数(你真的每天都学到新东西):filter_input_array()。
所以现在,从技术上讲,我可以做到这一点,而不是从GET超全球中抓取所有内容:
$GETdata = filter_input_array(INPUT_GET);
....等等与其他人一样,如POST,REQUEST等。我的问题是:我应该使用filter_input_array,以避免超级全局的祸害,或者有什么理由坚持下去并忘记关于使用filter_input函数?其他人的经历是什么?
编辑:我忘了一件事 - filter_input函数对你对超全局的任何脚本级修改都是盲目的,所以如果我这样做:$_GET['cheese'] = 'puff';
稍后尝试filter_input(INPUT_GET, 'cheese');
将返回null。这很好,因为我依赖注入了所有东西,但如果他们不知道的话,它可能会在以后引起别人的防范。
答案 0 :(得分:9)
使用filter_input_array仍然使用superglobals,因为它仍然从一个超全局数组中获取数据。
从这些阵列中获取数据没有任何问题,它实际上是获取数据的唯一方法。你必须确保你逃避它,无论你使用它是什么。
html的htmlentities,为pdo准备的字符串,mysql_real_escape_String用于mysql_函数等...
答案 1 :(得分:5)
为什么全局变量不好?
常见的论点是,因为你将非必然依赖引入外部状态。
你的解决方案并没有阻止它,它只隐藏它。
更好的解决方案是,imho,提供$ _GET作为参数,如
function myController($get) {
$user = Model::get_user($get['userid']);
render_view('user.html', $user);
}
myController($_GET)
因为它解释了全局变量被认为是坏的原因。
答案 2 :(得分:2)
我使用PHP超级全局,但仅限于我的框架中的库级别。这是所有控制器都可以访问请求对象的框架,而请求对象又访问超全局。这允许您通过使用测试参数填充模拟请求对象来为控制器编写测试。这都是关于良好的OO设计和良好的设计模式。
直接在任何地方访问超全球都没有任何抽象是一种反模式。
答案 3 :(得分:1)
我也非常讨厌这些全局变量。我肯定会使用filter_input_array
并在需要时使用数组。这解决了许多与全局相关的错误,并阻止您花费数小时来调试这些难以发现的全局变量。
我认为filter_input_array
是wtg!
答案 4 :(得分:1)
我认为没有人知道完美答案:)
有时候我会使用它,有时我会像$_GET['data']
那样得到数据,有时甚至会使用import_request_variables()
。
在某个项目中,我有一个特殊的类,即POST
,GET
,REQUEST
,并执行以下操作:POST::getValue('username')
或GET::getValue('session_id')
或{{ 1}} ...
答案 5 :(得分:1)
如果你真的不喜欢superglobals,为什么不在这里编写自己的清洁工具,如vB_Input_Cleaner类?
答案 6 :(得分:0)
几年前更糟糕的是,URL中的参数& x =显示为全局$ x。 Amyway,如果你不使用$ _GET,除了在框架中,它不存在。