这样的PHP文章令人堪忧
今天下午,tonsh给我看了一篇文章:关闭了register_globals 如何自动创建变量?。看完后,自己的感觉很奇怪:难道真的分不清什么是好的习惯,什么是不好的习惯吗?
文章作者看来是不喜欢PHP中的$_GET、$_POST数组,而是喜欢像以前那些,GET、POST过来的直接生成了一个个变量的方式。如果你不知道这是什么意思,我简单说一下:即当URL中有a=xxx这样的附加参数时,PHP会自动生成一个变量 $a,它的值就是’xxx’。当然,后来的PHP把register_global这个选项的默认值改成关闭状态了,这样一来,PHP就无法从请求中直接生成变量,而是把这些请求中夹带的数据分别放到了$_GET、$_POST、$_COOKIE这些数组中。这样一来,就不会和程序中用到的临时变量冲突,而且能很容易地区分出各个变量的来历。如果像以前那样直接生成变量了,你还能清楚地知道程序中的变量是怎么来的吗?我估计程序一大,你自己都分不清变量是怎么来的,又在哪些地方被修改过。明明PHP把register_global的默认状态改成关闭了,却还要把$_GET、$_POST、$_COOKIE再给extract出来,甚至最后来一个 unset($_GET)……
也许你会觉得,以前那种自己生成变量的方式很好,少打了很多字,现在用extract也终于可以的找到从前的感觉了。但是,请注意下面这样的代码:
$x = 'foo'; extract($_GET); // so much code... mysql_query("DELETE FROM foo WHERE name='$x'");
本意是想删除name=’foo’的记录,但中间却有了一个extract($_GET),这样一来,如果一个稍微懂点PHP的人在URL上加了x=????这样的参数,就可以随意删除任意一条记录,可怕吧……
再者,register_global会使得所有请求中的变量成为全局变量。全局变量过多,很可能导致软件的各个部分对全局变量的过度依赖,增加各个部分之前的耦合。耦合多了,就会出现牵一发而动全身的困境,从而制造出越来越多的bug,我想这绝不是大家希望看到的结果吧。
所以,我坚决主张,放弃PHP的register_global的特性,也决不要去用什么extract之类的东东去模拟这个特性。如果真的是想少打点字,觉得按Shift键比较累,特别是对$_COOKIE这样的变量名,我推荐以下三个函数:
function g($var){ return $_GET[$var]; } function p($var){ return $_POST[$var]; } function c($var){ return $_COOKIE[$var]; }
这样,想得到$_POST['xxx']这个值,只要用p(‘xxx’)就可以,少打了很多字。附加的一个优点是,因为你现在是通过函数去得到请求中的数据,这样,在这些函数中就可以对数据进行安全过虑的操作,可以减少很多的安全漏洞,而这一切,在写上层的代码时,根本不需要再考虑或者只需要考虑极个别的情况。
国内的很多有名的PHP程序的创造者,都是很多年前学的PHP,那时觉得PHP的很多特性很“酷”。但这些所谓的高级特性,甚至别的语言中不具备的独一无二的特性,很容易就会被滥用,造成大量的代码难以阅读,内部耦合严重等等的缺陷。这些程序的早期开发者,现在都已是老牌PHP程序员,他们有很多宝贵的经验,但也有很多的习惯是我们应该摒弃的,不能因为他们资历深就觉得他们说的什么都对,而是要有独立思考的意识和能力。我个人觉得,用PHP或者是正在学PHP的,不要认为PHP有很多高级特性而去不加选择地使用,如果能结合一下其他语言中的实际例子,看看同样的东西如果用别的语言怎么做出来,我想对自己会更有好处。
请问你这样的代码框是用什么插件实现的?
@1
WP-Syntax
register_global 有安全问题,php 4 改为了off,php 6将 remove that paramater from php.ini