PHPEye开源社区 » PHP技术讨论区 » [转]为什么PHP令人不爽(对于大型系统)
《Programming PHP》第二版上市
2007-10-26 10:16 flynetcn
[转]为什么PHP令人不爽(对于大型系统)

转自:[url]http://www.nirvanastudio.org/php/why-php-sucks.html[/url]

Posted by [url=http://www.nirvanastudio.org/author/ShiningRay]ShiningRay[/url] on 四月 3rd, 2006
                                        [url=http://www.bitstorm.org/edwin/en/]Edwin Martin[/url] <[email=edwin@bitstorm.org]edwin@bitstorm.org[/email]>.
翻译:[url=http://wiki.nirvanastudio.org/wiki/ShiningRay]ShiningRay[/url] @[url=http://www.nirvanastudio.org/]Nirvana Studio[/url]

我在过去的四年里一直致力于PHP应用的开发。PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。
下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。
1. 对递归的不良支持递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序([url=http://en.wikipedia.org/wiki/Quicksort]quicksort[/url])。不幸的是,PHP并不擅长递归。Zeev,一个PHP开发人员,说道:“PHP 4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。”[url=http://bugs.php.net/bug.php?id=1901]见bug 1901[/url]。这是一个很不好的借口。每一个编程语言都应该提供良好的递归支持。
2. 许多PHP模块都不是线程安全的在几年前,Apache发布了Web服务器的[url=http://httpd.apache.org/docs-2.0/new_features_2_0.html]2.0版[/url]。这个版本支持多线程模式,在这个模式下,软件一个一部分可以同时运行多个。PHP的发明者说PHP的核心是线程安全的,但是非核心模块不一定是。但是十次有九次,你想要在PHP脚本中使用这种模块,但这又使你的脚本不能合适Apache的多线程模式。这也是为什么PHP小组[url=http://www.php.net/manual/en/install.unix.apache2.php]不推荐在Apache 2 的多线程模式下运行PHP[/url]。不良的多线程模式支持使PHP常被认为是Apache 2依然不流行的原因之一。
请阅读这篇讨论: [url=http://apache.slashdot.org/apache/02/09/09/209235.shtml?tid=148]Slashdot: Sites Rejecting Apache 2?[/url].
3. PHP 由于商业原因而不健全通过使用缓存,PHP的性能可以陡增500%[[url=http://talks.php.net/show/acc_php/20]见基准测试[/url]]。那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者,它在销售自己的[url=http://www.zend.com/store/products/zend-platform/]Zend Accelerator[/url],所以当然,他们不想抛弃自己的商业产品这块肥肉。
但是有另一个可选择的: [url=http://pecl.php.net/package-info.php?package=APC]APC[/url]. (Zend后来推出Zend Optimizer,免费的加速器——译者)
4. 没有命名空间设想某个人制作了一个PHP模块用来阅读文件。模块中一个函数叫做read。然后另一个人的模块可以读取网页的,同样包含一个函数read。然后我们就无法同时使用这两个模块了,因为PHP不知道你要用哪个函数。
但是有一个很简单的解决方法,那就是命名空间。曾经有人建议PHP5加入这个特性,但不幸得是[url=http://www.php.net/ChangeLog-5.php#5.0.0b2]他没有这么做[/url]。现在,没有命名空间,每个函数都必须加上模块名作为前缀,来避免名称冲突。这导致了函数名恐怖得长,例如[url=http://www.php.net/manual/en/function.xsl-xsltprocessor-transform-to-xml.php]xsl_xsltprocessor_transform_to_xml[/url]让代码难于书写和理解。
5. 不标准的日期格式字符很多程序员对 [url=http://unixhelp.ed.ac.uk/CGI/man-cgi?date]日期格式字符[/url] 都很熟悉,它是从UNIX和C语言中来的。其他一些编程语言采用了这个标准,但是很奇怪的,PHP有它自己的一套完全不兼容的日期格式字符。在C中,“%j”表示一年中的当天,[url=http://www.php.net/manual/en/function.date.php]在PHP中[/url]他表示一个月中的当天。然而使事情更混乱的是:Smarty (一个很流行的PHP模版引擎)的 [url=http://www.php.net/manual/en/function.strftime.php]strftime[/url] 函数和 [url=http://smarty.php.net/manual/en/language.modifier.date.format.php]date_format[/url]函数,却使用了C/UNIX的格式化字符。
6. 混乱的许可证你也许认为PHP是免费的,所有的在手册中提到的PHP模块也是免费的。错了!例如,如果你想在PHP中生成PDF文件,你会在手册中发现两个模块:[url=http://www.php.net/manual/en/ref.pdf.php]PDF[/url] 和 [url=http://www.php.net/manual/en/ref.cpdf.php]ClibPDF[/url]。但是这两个都是有商业许可证的。所以,你所使用的每个模块,你都要确保你同意他的许可证。
7. 不一致的函数命名规则有些函数名称是有多个单词组成的。一般有三种单词组合的习惯:
[list=1][*]直接拼接:getnumberoffiles[*]用下划线分开:get_number_of_files[*]骆驼法则:getNumberOfFiles[/list]大部分语言选择其中一中。但是PHP都用到了。
例如,你想要把一些特殊字符转换成HTML实体,你会使用函数[i]htmlentities[/i] (直接拼接单词)。如果你要使用相反的功能,你要用到它的小弟弟[i]html_entity_decode[/i]。由于某些特殊的原因,这个函数名是由下划线分隔单词。怎么能这样呢?你知道有一个函数叫strpad。或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误。函数是不分大小写的,所以对于PHP来说[i]rawurldecode[/i] 和[i]RawUrlDecode[/i]之间没有什么区别。这也很糟糕,因为两个都使用到了同时他们看上去还不一样,混淆了阅读者。
8. 魔法引用的地狱魔法引用(Magicquote)可以保护PHP脚本免受SQL注入攻击。这很好。但是出于某些原因,你可以在php.ini中关闭这个配置。所以你如果要写出一个有弹性的脚本,你总要检查魔法引用是开启还是关闭。这样一个“特性”应该让编程更简单,而事实上变得更复杂了。
9. 缺少标准框架一个成长中的网站没有一个整体框架,最终会变成维护的噩梦。一个框架可以让很多工作变得简单。现在最流行的框架模型时MVC-模型,在其中表现层、业务逻辑和数据库访问都分离开了。
很多PHP网站不使用MVC-模型。他们甚至没有一个框架。甚至现在有[url=http://www.google.com/search?q=php+framework]一些PHP框架[/url]同时你都可以自己写一个,关于PHP的文章和手册没有提高框架的一个字。同时JSP-开发人员使用像Struts的框架、ASP开发人员使用.Net,看起来好像这些概念都广泛被PHP开发人员所了解。这就说明了PHP实际上到底是多专业。
总结
什么问题?

对于非常小的项目,它可以是一个十分符合人意的编程语言。但是对于较大的和更为复杂的项目,PHP就显出他的薄弱了。当你不断地摸索之后,你会发现我提到的某些问题的解决方案。所以,当解决方案已知之后,为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?
一个开源的语言十分流行是一件好事。但不幸得是,它不是一个伟大的语言。我希望所有的问题能有一天得到解决(也许在PHP6?),然后我们就将拥有一个开源语言,他既开源,又好用。

到现在,当你要启动一个多于5个脚本页面的项目的时候,你最好考虑C#/ASP.Net 或者 Java/JSP或者也许Python同样是一个更好的选择。

2007-10-26 11:58 flynetcn
到现在,当你要启动一个多于5个脚本页面的项目的时候,你最好考虑C#/ASP.Net 或者 Java/JSP或者也许Python同样是一个更好的选择。
-----------
这哥们说话是不是有点过了?!

2007-10-31 10:14 mayongzhan
很多问题都遇到过.痛苦...

2007-11-6 00:18 cid73
老掉牙的文章

2007-11-6 14:45 Physon
时至今日,大部分已经成为过去了,一些遗留问题还不可避免地存在,如命名问题。

PHP 并不是不能适应大型系统,只是是否值得的问题。

2007-11-6 15:28 flynetcn
PHP 并不是不能适应大型系统,只是是否值得的问题。
--------------------------------------------------------
php支持大型系统费劲?不合适?

嗨,这坛子曲高和寡呀

2007-11-6 18:15 Haohappy
这文章有些过时了。

2007-11-6 22:56 tianxj
这文章实在是太老了点,不过最近经常看到。
难道有人要踢PHP馆子了?

2007-11-7 20:02 flynetcn
这些舆论很会影响新人的选择:java or php or .net or asp ???
高手当然不屑。

技术也需要推销

--另外,今天看到hao大哥在phpe上的好多文章,佩服呀!

[[i] 本帖最后由 flynetcn 于 2007-11-8 16:10 编辑 [/i]]

2007-11-15 10:23 tomysk
分怎么考虑把 各个语言 各有优缺点 如果出一个没有缺点的 其他语言也就不存在了
所以 拿php根其他语言对比 肯定有好 有坏
很多人希望 自己用的语言能全面满足自己 可是 目前还没有一种语言能满足人们的全部需求,所以就要针对项目 和企业的条件 有所舍取
如果企业有时间 有钱 不妨用java,
如果企业没钱 有很着急开发,那不妨考虑php
我这里没有拿php跟java比的意思 这两个也不是一个级别 我只是说明 很多企业 也好 项目也好 都是为了满足自己的功能,并不会根据语言的来做何选择判断,都是从项目 企业的条件要求来选择使用何种语言来开发,所以讨论那个好那个坏没有意义,各个语言始终有各自的优点,会被人们来选择,如果当一种语言的优点 完全被另外一种版本 或者语言所替代,而且性能更好,更稳定,更节约成本,开发周期更短, 那么它就会慢慢退出市场

2007-12-26 12:31 wps2000
[quote]到现在,当你要启动一个多于5个脚本页面的项目的时候,你最好考虑C#/ASP.Net 或者 Java/JSP或者也许Python同样是一个更好的选择。[/quote]

我现在做的任何一个项目也不止这么一个数目,但是PHP依然工作得很好。

Java/JSP跑起来容易,快起来太难了

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.