10

我真的很讨厌全局变量——也许它是我心中的 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';尝试将返回 null。filter_input(INPUT_GET, 'cheese');这很好,因为我依赖注入所有东西,但如果他们不知道,它可能会在以后让某人措手不及。

4

7 回答 7

9

使用 filter_input_array 仍在使用超全局,因为它仍在从超全局数组之一中获取数据。

从其中一个数组中获取数据没有任何问题,它实际上是获取数据的唯一方法。你只需要确保无论你在什么地方使用它都能逃脱它。

html 的 htmlentities,pdo 的准备字符串,mysql_ 函数的 mysql_real_escape_String 等...

于 2011-04-14T15:45:54.890 回答
5

为什么全局变量不好?

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

您的解决方案不会阻止它,它只会隐藏它。

恕我直言,更好的解决方案是提供 $_GET 作为参数,如

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

myController($_GET)

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

于 2011-04-14T15:45:46.107 回答
3

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

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

于 2011-04-14T15:48:17.137 回答
1

我也很讨厌那些全局变量。我肯定会filter_input_array在需要时使用和使用数组。这解决了许多与全局相关的错误,并防止您花费数小时调试这些难以找到的全局变量。

我认为这filter_input_array是wtg!

于 2011-04-14T15:45:14.240 回答
1

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

有时我使用它,有时我得到数据就像$_GET['data'],有时我什至使用import_request_variables().

在某些项目上,我有特殊的类,该过程POST, GETREQUEST并执行以下操作:POST::getValue('username')or GET::getValue('session_id')or COOKIE::getValue('last_time_seen')...

于 2011-04-14T15:48:46.750 回答
1

如果你真的不喜欢超全局变量,为什么不在这里编写你自己的清理实现,比如 vB_Input_Cleaner 类呢?

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

于 2011-04-14T15:53:17.783 回答
0

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

于 2011-04-14T18:42:56.040 回答