我真的很讨厌全局变量--也许这是我的C#程序员,但当我在PHP中工作时,我每次都会咬紧牙关做这样的事情:
$strUsername = $_GET['username'];是的,我把它过于简单化了,是的,是的,我正确地清理了所有这些东西。事实上,对于我构建的框架,所有的超全局变量几乎在执行开始时就被捕获,并从那里开始依赖注入。
我在PHP手册中遇到了这个函数(你确实每天都能学到一些新东西):filter_input_array()。
所以现在,从技术上讲,我可以这样做,而不是从GET superglobal抓取所有东西:
$GETdata = filter_input_array(INPUT_GET);……我的问题是:我是不是应该使用filter_input_array来避免超全局函数的灾难,还是有什么理由坚持使用它们而忘记使用filter_input函数?其他人对此的经验是什么?
编辑:我忘了一件事-- filter_input函数对您对超全局变量所做的任何脚本级修改都是看不见的,所以如果我这样做了:稍后尝试执行filter_input(INPUT_GET, 'cheese');的$_GET['cheese'] = 'puff';将返回null。这是很好的,因为我依赖注入所有东西,但它可能会让一些人稍后猝不及防,如果他们不知道。
发布于 2011-04-14 23:45:55
使用filter_input_array仍然使用超全局变量,因为它仍然从一个超全局数组中获取数据。
从这些数组中获取数据并没有错,这实际上是获取数据的唯一方法。你只需要确保无论你在什么地方使用它,你都要避开它。
html的实体、pdo的准备好的字符串、mysql_函数的mysql_real_escape_String等等...
发布于 2011-04-14 23:45:46
为什么全局变量是不好的?
常见的论点是,因为您向外部状态引入了不安全的依赖关系。
您的解决方案无法阻止这一点,它只是隐藏了它。
一个更好的解决方案是,imho,提供$_GET作为参数,如下所示
function myController($get) {
$user = Model::get_user($get['userid']);
render_view('user.html', $user);
}
myController($_GET)因为这说明了为什么全局变量被认为是不好的。
发布于 2011-04-14 23:48:17
我使用PHP超全局变量,但仅在我的框架中的库级别使用。这是一个框架,所有的控制器都可以访问请求对象,而请求对象又可以访问超全局变量。这允许您通过创建一个填充了测试参数的模拟请求对象来为控制器编写测试。这一切都是关于好的OO设计和好的设计模式。
在没有任何抽象的情况下,直接在任何地方访问超全局变量是一种反模式。
https://stackoverflow.com/questions/5665813
复制相似问题