本文发出后,确实引起不少的争议。看来php的支持者不少啊。但是,从一个侧面来审视php,也未尝不可。
从php3到php4到php5,再到php6,php确实越来越完善,功能也更强大。php为一开放源码项目,其中包括可以简化程序的描述性语言引擎以及一个大的链接库,也有专门开发php的公司,如zend就有销售php套装产品、程序撰写工具及技术支持服务。尤其是跨平台的使用特性将使它在linux平台大放异彩。可以直接使用java的类库,可以直接调用perl/c等语言写的程序增强了它的可扩展性。越来越成熟的mvc开发框架使它能适应企业级的大型应用开发。再加上它天生强大的数据库支持能力。确实博得了很多用户的喝彩!
不过,这里倒是想从侧面来看看php也许不称职的几个理由。
1.应用范围仍然有限 与java相较,php可用范畴限制较多,它仅能用在网络服务器上,不像java,同时可用在网络服务器、个人计算机、手机、芯片卡或其它装置。记得有个老友陈述放弃php的原因:“第一:每个变量前面要写一个$符号; 第二:因为不是编译执行的方式; 第三:面向对象的功能不强。”比如,php的oop运行一次就退出,下次还要继续重建o,继续继承....。注意是每一次请求,它不能利用上一次的结果,下一次用还要从头初始化。许多问题的根源还在于apache。
再一个:“可能目前php ide不是很好,给别人入门难的感觉。”尽管新版本增加了面向对象功能,但相比成熟的java,仍然有许多待改进之处。以至于有人这么归纳: (1)缺乏广泛的使用,以至于微软也要和大家讨论php到asp.net的迁移。(2)缺乏大公司的支持,象ibm的开发中心开源项目首页上的6个标题中,php只有3个。 (3)缺乏重量级的应用,象google和yahoo用php(不是所有的产品)都是瞎玩。当然,我知道taobao.com也是php做的。
2.调试还是不太方便 在apache上的进程工作模式。 apache处理每一个php请求,都要创建一个子进程,这样的话实现连接池比较困难了,进程间的数据共享一般只能通过文件,数据库什么的完成,各项开销比较大,当然速度并不低。
还是陈述一个网友的发言:“没有好的开发工具,调试起来过于复杂。虽然zend不错,但是哪里是vs的对手。没有强大的visual 开发工具,换句话,如果有了,我绝对选择php。”这好像是和java早期比较类似的一个情形。也许,在不远的未来,我们会看到很好的调试工具。问题是:现在还没有太称心的,尤其是大型系统上。
还有个问题,就是共享内存的使用,我就不知道为什么直接使用php操作共享内存就这么复杂,而且速度居然比直接操作磁盘文件还慢。
3.主流版本的安全漏洞百出 看一个最近的新闻,和php pdflib扩展绕过open_basedir安全限制漏洞有关。受影响系统:php php 5.3.0。php所使用的pdflib扩展没有正确的强制基础php配置指令,这允许攻击者绕过open_basedir限制在非授权位置写入文件。仅在多个用户可以创建和执行任意php脚本代码的共享托管配置中才会出现这个漏洞。在这种情况下,open_basedir限制应彼此隔离用户。
php v6 在添加一些新特性的同时,也删除了以前版本中的一些函数和特性。被删除的大部分东西,比如 register_globals 和 safe_mode,在当前的 php 中都被广泛认为是 “有漏洞的”,因为它们可能招致安全风险。当然,php的配置非常灵活,可以通过php.ini, httpd.conf, .htaccess文件(该目录必须设置了allowoverride all或options)进行设置,还可以在脚本程序里使用ini_set()及其他的特定的函数进行设置。通过phpinfo()和get_cfg_var()函数可以得到配置选项的各个值。
4.大型系统的稳定性与一种语言的风格 有人这么说(也是一个php读者的疑问):“大型系统还是用.net或者jsp吧,不是因为php不可靠,是因为开发php的人良莠不齐,而php的开发模式又不固定,以你问这问题的情况来看,如果是多人开发,你肯定控制不好。.net或者jsp相对来说比较容易控制,可以让程序结构清晰,二次开发或者更换程序员都不会有太大问题。”
老牌计算机作家bruce eckel也这么说:“你经常会发现很多使用php编写出的代码错误百出,但这些代码往往却被人们互相拷贝,却没有人去认真分析研究它们。这些代码通常是由那些习惯互相借鉴拷贝代码的程序员所编写,这些代码质量低劣的原因是这些程序员通常不习惯问为什么,不喜欢弄清楚原理,只管拿来就用。”为了让大家可信,我放出他的相片吧。
很自然,作为普通读者,会产生一个焦点问题:php到底有没有前途?你说有前途是把,再秀几点理由?
5.php的解释运行机制 也许有经验的php程序员最感到痛苦的地方是php的解释运行机制。这种运行机制使得每个php页面被解释执行后,所有的相关资源都会被回收。也就是说,php在语言级别上没有办法让某个对象常驻内存。在php中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空。以jsp为例,在jsp中,java bean的scope有四种有效值:page、application、session、request,分别对应页面、程序、会话、请求四种生存期。但在php中,只有page一种生存期。
在php中,如果需要在页面之间共享数据,需要手动将变量保存到预定义的全局变量$globals或$_session中。php会将这些变量保存在某个文件中,以便下次执行页面时读取。但是,这种方式存在着极大的限制,除了效率的低下外,它还无法保存引用外部资源的变量,例如文件、socket、数据库连接等,而正是这些资源最需要被缓存。
这导致了许多高级的模式和技术无法使用。例如,即使是最简单的singleton模式也无法在php中被应用。虽然可以使用php写出singleton的代码,但是由于php中没有真正全局的static变量,所以每次页面被执行时,都会重新建立新的对象,这样也就完全失去了singleton的意义。这也导致复杂的or mapping技术难以应用,因为没有对象的缓存机制,or mapping的开销已经使这种技术失去了意义。
6.前途未卜,开源的商业模式到底能撑多久? 对于从事php开发的同志们来说,mysql的重要性是显而易见的。还是老牌计算机作家bruce eckel的一个观点:php主要是与数据库搭配使用,数据库来处理所有一致性问题,因此多数人只关心从数据库中存取数据,而不用再去必须考虑底层的问题。但是这个语言不仅仅可以处理与数据库交互的上层问题,同样也可以实现与文件系统之间交互的底层问题。我的感觉是,在php社区中多数人只关心如何得到一个好的结果,而没有多少人关心它的真正实现原理,因此才出现了这种错误的倾向。
再看一个新闻(2008-1-21 ):国外媒体今天发表分析文章称,sun之所以斥资10亿美元收购开放源代码软件公司mysql,主要是为了进军web2.0软件市场。sun周三宣布,该公司已经同mysql达成最终协议,将以10亿美元收购这家开放源代码软件厂商。从交易价值来看,这是迄今为止开放源代码领域最大的交易,其规模甚至接近之前所有开放源代码交易的总和,包括红帽以3.26亿美元收购jboss,citrix以5亿美元收购xensource,以及雅虎以3.5亿美元收购zimbra。
在《sun总裁博客:我们为什么收购mysql》一文中,sun总裁提出:除了要收购 mysql,sun 将提出面向 mysql 市场的全球支持解决方案。我们将同时在社区和市场两方面注入资金 —— 以加速本行业由专属技术阶段向开放式网络平台阶段转化的进程。并认为:新创公司和网络公司的 cto 不同意使用收费的非开源产品。他们需要也想要获取源代码以实现优化和快速解决问题(尽管他们乐于对其认为有价值的支持服务付费)。另一方面,更多传统 cio 不同意使用不受商业关系背景支持的产品—— 因为他们更放心借 sun 供应商之手来管理全球性业务和关键基础架构。
仔细分析一下吧。还是那句老话,你也许认为php是免费的,所有的在手册中提到的php模块也是免费的。但是,如同一个有生命力的产品一样,免费的东西,也许会有很多理念的不统一。
一个晚上,评论无数。反对的意见也不是不接纳,这里先展示一个老友的反驳意见: 1. 面向对象不足
如果你使用过php 5的话,你就不会这样说了,你所想到的东西:访问权限(public/private)、继承、抽象类、接口、克隆、串行化、自动垃圾收集、静态成员、强大的异常处理...
可以说基本上常见的面向对象的东西都有了,不要以为php5很遥远,其实目前有很多人、很多项目都在使用php 5,你最好自己尝试一下看看。
建议参考:
http://www-128.ibm.com/developerworks/cn/opensource/os-phpobj/
http://www-128.ibm.com/developerworks/cn/opensource/os-advphpobj/
2. 变量名前面加 $
这个只能算是一个小问题,是php告诉大家这是php独特特征的地方,php不是java,不是c++,它是从开源世界走出来的脚本语言,有了$,我觉得很亲切,很棒。
3. 不是编译执行
这个当然比不上cgi了,如果你用c写cgi的化,但是我想,php的执行速度不会比jsp差到哪里去的吧,也不会比asp慢。另外,zend有相关的商业工具来作类似于编译的工作。
4. php太灵活
我想,谁都比较喜欢能够自由控制的语言,这样才能体现程序员的技术,当然,灵活也会带来很多问题,比如很容易出错,而且不容易找到,对于初学者的代码可能会写的很糟糕。但是,这就是php呀,这才是我们心目中开源的、自由的、高效的php
5. 没有mvc框架
呵呵,如果你使用过 phpcake、zend frame的话,我想你不会说没有框架,只是成熟程度的问题,其实cake和zend frame都非常棒,当然,另外一些象 prado、phpmvc等框架也是值得一提的
参考:http://framework.zend.com/、http://cakephp.org/
6. 没有好的ide
php的特点就是简单,容易开发,你可以使用记事本,vi,也可以使用editplus、ue,同样也可以使用nu、zend等等工具,选择很大,其实不要跟vs2003比较,因为他们不是一个东西,vs是个统一开发平台,php只是一门脚本语言,使用zend已经足够了,至少我是这么觉得。
7. 扩展不容易写
呵呵,我想asp的com也不是那么好写的,jsp里面的javabeans也不是那么简单的,没有很容易的事情,简单或者复杂程度取决于你对一项事务的认识程度。如果你c学的好,你就不会觉得扩展不好写。当然,相对来说,用c写php扩展是稍微有点复杂,不过,因为复杂,所以你才能靠写扩展拿高薪呀,呵呵。
建议参考:《php程序设计》第十四章[扩展php]
8. 调试不方便
我不知道怎样算是调试方便,如果你使用过ruby、perl写cgi,你会知道什么是调试不方便。如果你喜欢写c,使用gdb之类的命令行工具,你会知道什么是不方便。当然了,相对来说,你使用好的ide,调试的工作量会减少很多的。
