PHP 里的 SB 设定


作者:郑凯

由于画蛇添足的 magic_quotes_runtime 和 magic_quotes_gpc,两个烦人的配置变量的存在,导致凭空多出了许多麻烦。昨天就发现在自己机器上运行正常的添加文章在网上使用的时候 POST 被莫名其妙的 addslashes,一查得知 magic_quotes_gpc 的问题,gpc 就是三种变量取得方式:GET、POST、COOKIE,从这三种途径得到的变量就统统惨遭 addslashes,而且 magic_quotes_gpc 还是无法更改的:在第一条 PHP 语句运行前,这些输入进来的变量就已经被“做”了!真是讨厌,为何要有这种设定!没有多少程序是专门为某一台特定主机编写的,各个主机的 php.ini 各有不同,可 PHP Team 却在这里想着法的制造麻烦和混乱。由于程序要适应各种环境,结果都必须额外加上一段去统一 magic_quotes_gpc 不同所带来的变化。结果,所有优秀的程序都需要考虑这些讨厌的、根本没必要也不应该的问题而去增加代码、降低效率。这个配置的变量的初衷是为了方便懒人,不用去加 addslashes,可结果呢?你怎么知道那些应该加哪些不应该加?如果真的要方便,为什么不把 addslashes 改成像 str_replace 那样既可以替换 string 又可以替换 array?

迫不得已写了两个函数:

[phpcode]
function gpc_addslashes($string) {
return (get_magic_quotes_gpc() ? $string : addslashes($string));
}

function gpc_stripslashes($string) {
return (get_magic_quotes_gpc() ? stripslashes($string) : $string);
}
[/phpcode]

又如 parse_str,格式是

void parse_str ( string str [, array arr])

居然无返回值,而输出值是在参数里,多么奇怪的函数?!为什么格式不是通常这样?

array parse_str ( string str)

而且第二个参数的默认值居然是一个叫 $arr 的古怪东西,而不是和第一个参数一样,结果我不得不写出这样 SB 的语句:

[phpcode]
parse_str($referer["query"], $referer["query"]);
// 而不是通常的这种正常的写法:
$referer["query"] = parse_str($referer["query"]);
[/phpcode]

又比如 fsockopen 这个 SB 函数,第二个参数 port 居然没有缺省值!不管什么端口你默认一个好不好啊,还多占一个参数的位置。比方说我要连接就必须 fsockopen("www.example.com", 80),而如果是 MySQL 连接,可以是 mysql_connect("www.example.com") 或者 mysql_connect("www.example.com:3306"),优劣一目了然。

再骂也没用,为了兼容老版本的程序,这些问题就是再离谱也无法纠正了。只恨那些连基本的 C 写法都不清楚的人也加入到 PHP 的开发中,一个随意的瞎设定,造就无数程序员的冗余劳动。