background image

PHP 程序员自述:PHP 一些严重的缺陷汇总

1. 对递归的不良支持

递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。
有一个使用递归的例子是快速排序(quicksort)。不幸的是,PHP 并不擅长递归。Zeev,一个
PHP

开发人员,说道: PHP 4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也

就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。 见 bug 1901。这是一个
很不好的借口。每一个编程语言都应该提供良好的递归支持。

2. 许多 PHP 模块都不是线程安全的

在几年前,Apache 发布了 Web 服务器的 2.0 版。这个版本支持多线程模式,在这个模式下,
软件一个一部分可以同时运行多个。PHP 的发明者说 PHP 的核心是线程安全的,但是非
核心模块不一定是。但是十次有九次,你想要在 PHP 脚本中使用这种模块,但这又使你
的脚本不能合适 Apache 的多线程模式。这也是为什么 PHP 小组不推荐在 Apache 2 的多线
程模式下运行 PHP。不良的多线程模式支持使 PHP 常被认为是 Apache 2 依然不流行的原
因之一。

3. PHP 由于商业原因而不健全

通过使用缓存,PHP 的性能可以陡增 500%[见基准测试]。那么为什么缓存没有被构建在
PHP 中呢?因为 Zend——PHP 的制造者,它在销售自己的 Zend Accelerator,所以当然,他
们不想抛弃自己的商业产品这块肥肉。

 

但是有另一个可选择的: APC. (Zend 后来推出 Zend Optimizer

——

,免费的加速器

译者)

4. 没有命名空间

设想某个人制作了一个 PHP 模块用来阅读文件。模块中一个函数叫做 read。然后另一个人
的模块可以读取网页的,同样包含一个函数 read。然后我们就无法同时使用这两个模块了,
因为 PHP

 

不知道你要用哪个函数。但是有一个很简单的解决方法,那就是命名空间。曾经

有人建议 PHP5 加入这个特性,但不幸得是他没有这么做。现在,没有命名空间,每个函
数都必须加上模块名作为前缀,来避免名称冲突。这导致了函数名恐怖得长,例如
xsl_xsltprocessor_transform_to_XML 让代码难于书写和理解。

5. 

 

不标准的日期格式字符

 

 

很多程序员对 日期格式字符 都很熟悉,它是从 UNIX 和 C 语言中来的。其他一些编程语
言采用了这个标准,但是很奇怪的,PHP 有它自己的一套完全不兼容的日期格式字符。在
C

中, %j”表示一年中的当天,在 PHP 中他表示一个月中的当天。然而使事情更混乱的是:

Smarty (一个很流行的 PHP 模版引擎)

 

的 strftime 

 

函数和 date_format 函数,却使用了

C/UNIX 的格式化字符。

6. 混乱的许可证

你也许认为 PHP 是免费的,所有的在手册中提到的 PHP 模块也是免费的。错了!例如,如
果你想在 PHP 中生成 PDF 文件,你会在手册中发现两个模块:PDF   

和 ClibPDF。但是这

两个都是有商业许可证的。所以,你所使用的每个模块,你都要确保你同意他的许可证。

7. 不一致的函数命名规则

有些函数名称是有多个单词组成的。一般有三种单词组合的习惯:
直接拼接:

getnumberoffiles

用下划线分开:

get_number_of_files

骆驼法则:

getNumberOfFiles

大部分语言选择其中一中。但是 PHP 都用到了。
例如,你想要把一些特殊字符转换成 HTML 实体,你会使用函数 htmlentities (直接拼接单