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

Jar*_*les 10 php superglobals

我真的讨厌全局变量 - 也许它是我的C#程序员,但是当我在PHP工作时,每次我必须做这样的事情时我都会咬牙切齿:

$strUsername = $_GET['username'];
Run Code Online (Sandbox Code Playgroud)

是的,我非常过于简单化了,是的,我正确地清理了所有这些.事实上,对于我构建的框架,所有的超级全局都在执行开始时被抓取,并从那里开始依赖注入.

我在PHP手册中遇到了这个函数(你真的每天都学到新东西):filter_input_array().

所以现在,从技术上讲,我可以做到这一点,而不是从GET超全局中获取所有内容:

$GETdata = filter_input_array(INPUT_GET);
Run Code Online (Sandbox Code Playgroud)

....等等与其他人一样,如POST,REQUEST等.我的问题是:我应该使用filter_input_array,以避免超级全局的祸害,或者是否有某些理由坚持使用它们而忘记使用filter_input函数?其他人的经历是什么?

编辑:我忘记了一件事 - filter_input函数对你对超全局的任何脚本级修改都是盲目的,所以如果我这样做:稍后$_GET['cheese'] = 'puff';尝试做filter_input(INPUT_GET, 'cheese');会返回null.这很好,因为我依赖注入了所有东西,但如果他们不知道的话,它可能会让后来的人措手不及.

Gal*_*len 9

使用filter_input_array仍然使用superglobals,因为它仍然从一个超全局数组中获取数据.

从这些阵列中获取数据没有任何问题,它实际上是获取数据的唯一方法.你必须确保你逃避它,无论你使用它.

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


kep*_*pla 5

为什么全局变量不好?

常见的论点是,因为您将非必要的依赖项引入外部状态.

你的解决方案并没有阻止它,它只隐藏它.

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

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

myController($_GET)
Run Code Online (Sandbox Code Playgroud)

因为这解释了全局变量被认为是坏的原因.

  • 是的,这叫做"依赖注入".为了改善你的代码,将`$ get`重命名为`$ request`就好了. (2认同)
  • 我只是写下来,我甚至不记得PHP的命名约定,因为我离开它为甜python :).也许也是一个有趣的搜索术语:demeter法则. (2认同)