我真的讨厌全局变量 - 也许它是我的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.这很好,因为我依赖注入了所有东西,但如果他们不知道的话,它可能会让后来的人措手不及.
使用filter_input_array仍然使用superglobals,因为它仍然从一个超全局数组中获取数据.
从这些阵列中获取数据没有任何问题,它实际上是获取数据的唯一方法.你必须确保你逃避它,无论你使用它.
html的htmlentities,为pdo准备的字符串,用于mysql_函数的mysql_real_escape_String等...
为什么全局变量不好?
常见的论点是,因为您将非必要的依赖项引入外部状态.
你的解决方案并没有阻止它,它只隐藏它.
imho,更好的解决方案是提供$ _GET作为参数,如
function myController($get) {
$user = Model::get_user($get['userid']);
render_view('user.html', $user);
}
myController($_GET)
Run Code Online (Sandbox Code Playgroud)
因为这解释了全局变量被认为是坏的原因.