笔者在过去的四年里一直致力于PHP应用的开发PHP确实十分容易编写但是PHP也有一些十分严重的缺陷
下面笔者会给出自己的理由为什么PHP不适合于比小型业余网站更大的网站
对递归的不良支持
递归是一种函数调用自身的机制这是一种强大的特性可以把某些复杂的东西变得很简单有一个使用递归的例子是快速排序(quicksort)不幸的是PHP并不擅长递归Zeev一个PHP开发人员说道PHP (Zend)对密集数据使用了栈方式而不是使用堆方式也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少见bug 这是一个很不好的借口每一个编程语言都应该提供良好的递归支持
许多PHP模块都不是线程安全的
在几年前Apache发布了Web服务器的版这个版本支持多线程模式在这个模式下软件一个一部分可以同时运行多个PHP的发明者说PHP的核心是线程安全的但是非核心模块不一定是但是十次有九次你想要在PHP脚本中使用这种模块但这又使你的脚本不能合适Apache的多线程模式这也是为什么PHP小组不推荐在Apache 的多线程模式下运行PHP不良的多线程模式支持使PHP常被认为是Apache 依然不流行的原因之一
请阅读这篇讨论 Slashdot: Sites Rejecting Apache ?
PHP 由于商业原因而不健全
通过使用缓存PHP的性能可以陡增%[见基准测试]那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者它在销售自己的Zend Accelerator所以当然他们不想抛弃自己的商业产品这块肥肉
但是有另一个可选择的 APC (Zend后来推出Zend Optimizer免费的加速器——译者)
没有命名空间
设想某个人制作了一个PHP模块用来阅读文件模块中一个函数叫做read然后另一个人的模块可以读取网页的同样包含一个函数read然后我们就无法同时使用这两个模块了因为PHP不知道你要用哪个函数
但是有一个很简单的解决方法那就是命名空间曾经有人建议PHP加入这个特性但不幸得是他没有这么做现在没有命名空间每个函数都必须加上模块名作为前缀来避免名称沖突这导致了函数名恐怖得长例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解
不标准的日期格式字符
很多程序员对 日期格式字符 都很熟悉它是从UNIX和C语言中来的其他一些编程语言采用了这个标准但是很奇怪的PHP有它自己的一套完全不兼容的日期格式字符在C中%j表示一年中的当天在PHP中他表示一个月中的当天然而使事情更混乱的是Smarty (一个很流行的PHP模版引擎)的 strftime 函数和 date_format 函数却使用了C/UNIX的格式化字符
混乱的许可证
你也许认为PHP是免费的所有的在手册中提到的PHP模块也是免费的错了!例如如果你想在PHP中生成PDF文件你会在手册中发现两个模块PDF 和 ClibPDF但是这两个都是有商业许可证的所以你所使用的每个模块你都要确保你同意他的许可证
不一致的函数命名规则
有些函数名称是有多个单词组成的一般有三种单词组合的习惯
直接拼接getnumberoffiles
用下划线分开get_number_of_files
骆驼法则getNumberOfFiles
大部分语言选择其中一中但是PHP都用到了
例如你想要把一些特殊字符转换成HTML实体你会使用函数htmlentities (直接拼接单词)如果你要使用相反的功能你要用到它的小弟弟html_entity_decode由于某些特殊的原因这个函数名是由下划线分隔单词怎么能这样呢?你知道有一个函数叫strpad或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误函数是不分大小写的所以对于PHP来说rawurldecode 和RawUrlDecode之间没有什么区别这也很糟糕因为两个都使用到了同时他们看上去还不一样混淆了阅读者
魔法引用的地狱
魔法引用(Magic quote)可以保护PHP脚本免受SQL注入攻击这很好但是出于某些原因你可以在phpini中关闭这个配置所以你如果要写出一个有弹性的脚本你总要检查魔法引用是开启还是关闭这样一个特性应该让编程更简单而事实上变得更复杂了
缺少标准框架
一个成长中的网站没有一个整体框架最终会变成维护的噩梦一个框架可以让很多工作变得简单现在最流行的框架模型时MVC模型在其中表现层业务逻辑和数据库访问都分离开了
很多PHP网站不使用MVC模型他们甚至没有一个框架甚至现在有一些PHP框架同时你都可以自己写一个关于PHP的文章和手册没有提高框架的一个字同时JSP开发人员使用像Struts的框架ASP开发人员使用net看起来好像这些概念都广泛被PHP开发人员所了解这就说明了PHP实际上到底是多专业
总结
什么问题?
对于非常小的项目它可以是一个十分符合人意的编程语言但是对于较大的和更为复杂的项目PHP就显出他的薄弱了当你不断地摸索之后你会发现笔者提到的某些问题的解决方案所以当解决方案已知之后为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?
一个开源的语言十分流行是一件好事但不幸得是它不是一个伟大的语言笔者希望所有的问题能有一天得到解决(也许在PHP?)然后我们就将拥有一个开源语言他既开源又好用
到现在当你要启动一个多于个脚本页面的项目的时候你最好考虑C#/ASPNET 或者 Java/JSP或者也许Python同样是一个更好的选择
在笔者写了这篇文章之后一些人告诉笔者一些其他的类似文章
Experiences of Using PHP in Large Websites
PHP in contrast to Perl
I hate PHP
PHP Annoyances