我应该使用PHP Superglobals或Filter Input来检索$ _GET数据吗?

时间:2011-04-14 15:40:19

标签: php superglobals

我真的讨厌全局变量 - 也许是我的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。这很好,因为我依赖注入了所有东西,但如果他们不知道的话,它可能会在以后引起别人的防范。

7 个答案:

答案 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()

在某个项目中,我有一个特殊的类,即POSTGETREQUEST,并执行以下操作:POST::getValue('username')GET::getValue('session_id')或{{ 1}} ...

答案 5 :(得分:1)

如果你真的不喜欢superglobals,为什么不在这里编写自己的清洁工具,如vB_Input_Cleaner类?

http://members.vbulletin.com/api/

答案 6 :(得分:0)

几年前更糟糕的是,URL中的参数& x =显示为全局$ x。 Amyway,如果你不使用$ _GET,除了在框架中,它不存在。