PHP将死。何以为继?

是到了PHP落幕的时候了。就在我这个顽固的PHP分子正要把一个现有的Ruby on Rails代码库转换成PHP时,我要说这样的话。

历史在重演

我认为PHP将亡,因为我以前见到过。大概十年之前,PHP灭掉了Perl。当然了,并不十分彻底;它还坚守在某些环境里,它还有相当可观数量的顽固粉丝,遗留下来的应用程序也需要维护,持续几十年。但这种语言对于新一代的人,特别是web开发者,它在1999年就开始灭亡了,到2005年左右几乎完全死了。

作为在那个时期出现的新的web开发者,事情显的很明白而且水到渠成:Perl已经不适应新的应用开发环境了。在Perl里,页面需要冗长的公式化的CGI方式实现,而这些在PHP里却可以用基本的、缺省的编程方式实现。Perl语言里到处都是旧时代的特征 — 引用,不方便的数据结构,还有其他许多的小的古怪语法语义 —— 这使得web开发冗长,不稳定,不方便。无怪乎没有一个出色的web应用是用Perl写成的,而用PHP你却能做的又快又简单,尽管PHP存在着在当时就显而易见的缺陷。

在1999年支持Perl反对PHP的争论有很多:Perl要快的多,有更多的程序库和驱动支持,CPAN是个神奇的地方,里面预先写好的代码能让你绝大部分任务省去80%的工作量。现在看起来这些就有点可笑了,但“PHP缺乏可扩展性”却是个真正的缺点。但总之PHP赢了,因为上面所说的这些问题并不是这种语言固有的。PHP解释器可以变得更快,程序库可以被开发出来,PERA和PECL目前已经变得相当庞大,这还不包括各种厂商希望人们去使用他们的API而提供的非正式的程序库。

时间在推移

十年之后,我可以感觉到历史大潮正在重演。开发人员对语言的期望在前进。如果说Perl最缺乏的是PHP里令人惊讶的灵活的“关联数组”(也就是智能哈希表),那么PHP现在缺乏的就是lambdas和方法链(method chaining)了。同时PHP往往是用在只要20行代码就能写出一个网页的地方,而如今却是如果你不使用什么MVC框架之类的东西就会被认为没有把事情做对。公式化的代码表明了问题所在:这种语言需要一个框架来替人们做这些事情。

退回到以前,我认为那些顽固的使用Perl来做web开发的人很傻。现在,经历了十年的PHP开发,我处在相同的位置上了。我可以在一个小时里用PHP敲出一个不错的网站,在一两天里开发出一个优秀的网站。PHP的性能众人皆知,我可以无限的扩展它。我雇佣过的每个开发人员都会它,我集成过的每个系统里都有一个用它写出的打包的代码库。我深陷于PHP的方便性,尽管它对于我的任务并不是一个合适的语言。

转向Ruby on Rails

最明显有潜在能力继任PHP的是Ruby on Rails。Ruby是一个新的、干净的语言,具有现代的语言特征,松散、优雅的语法(很像Python)。Rails省去了我们常见的任务,省去了集成web应用里的公式化的做法,把PHP里三、四行的习惯写法变成了first-class语言结构。这看起来极其像我需要的PHP替代品、能让开发工作再一次提速的东西。

我每天使用Rails,修改一个喜爱这种框架和语言的有经验的Rails专家所写的Rails应用,七个月后,我却不能断言Rails是一个正确的选择了,原因很难表达。我这篇文章的目的就是想试图把原因说清楚。

我的主要的抱怨,必须要提的,就是性能。我之前就说过这种问题不应该被当作一种语言的致命缺陷,它只是语言实现中的暂时的问题。所以我不能把这当作一个真正的问题,尽管它是我把现在的应用移植到PHP的最主要的一个原因。我可以让Rails跑的跟PHP一样快,但那需要提供2到4倍高的硬件条件。我估计五年内将还会这样,五年后我也许不必把程序移植到PHP。但现在,它不能满足我的要求。

第二,我讨厌Active Record。Active Record是一种模式,并不是Ruby固有的,在Rails的最新版本里是可选择的,但是对它的使用和这种模式已经深入到了Rails的DNA里了。我之前曾解释过为什么我认为这数据库上的ORM不是个好做法,所以我不会再重复解释,但有一点我需要总结的就是你省去了手工写CRUD所获得的效能要大于ActiveRecord做傻事所损失的效能,要花时间搞清楚它是怎么工作的,顺应框架原则,防止它做这样的事情。

第三,我十分的不信任代码自动生成。工具能帮你生成模板式的代码很有用,但你的程序了却多出了成堆的毫无用处的代码来实现这些目的,这就变的不好了。代码生成喜欢“神奇推理”,因为生成器并不确定代码某些特别有用的特征究竟是专门写出的还是语言环境固有自带的。神奇推理是危险的。

代码生成让我想到了Ruby on Rails的一个可能是最根本的问题,就是它并不是一种语言。Ruby是一种语言。但Ruby,它在解决了PHP上的一些基本问题外,并没有解决核心问题,那就是现代web应用需要一系列的改进:像routing,model/view分类,drop-in功能性等都是很常见的特征。Rails里有,但这跟PHP里的Zend,Symfony 和 Code Igniter之类的MVC框架一样只是绑上去的绷带。

那么缺的是什么?

能够取代PHP的语言必须十分优秀于PHP,就如同PHP优秀于Perl一样。它必须承担起web应用的主要实现任务,就像PHP那样,你的代码的主要功能就是输出网页 —— 一个有点激进的要求,它要不适合去做其它的事情,例如当中shell脚本语言。我希望有这样一种语言,它能够承担起我开发一个MVC式的web应用时的所有的任务,所有功能都是核心内置的,不能仅是一个程序包。

问题是,没有这样的一种语言。有一段时间服务器端JavaScript看起来将会成为下一个重要的语言,它能统一web应用前端和后端的编程语言。但是这些JavaScript上的伟大思想总是徘徊在一些跑题的行为上,比如nodejs:事件驱动模式非常的激进和强大,能让你开发出高性能的应用程序,最大化的使用新式硬件,但这是一种开发服务器端应用程序的思路,不是web页面。并且你仍然需要去写一大堆可怕的web页面。另外一些CommonJS的成果例如ejScript开始尝试着取代PHP,但仍没有解决框架问题。

仍在等待

我不得不做出结论,PHP的替代者还不存在。Ruby on Rails很好,但并不比一个PHP之上的类似的MVC框架强多少,更别提由于Ruby自身的效率不高和ActiveRecord的ORM恶搞带来的双重打击。Python看起来并不感兴趣于作为下一代的web语言,JavaScript的服务器端解决方案还刚刚只是个开始。

我等待下一个大目标的出现。我希望能从PHP上转走,真的。我可不想成为Perl式的古董。但不管怎样,这种语言看起来还不存在。我判断错了吗?

分享这篇文章:
[英文原文:PHP needs to die. What will replace it? ]

32 Responses to PHP将死。何以为继?

  1. 思乐 says:

    PHP将死,这个在现在以及很长时间里还是不会发生的。

  2. sf says:

    既然无继,怎会灭亡,呵呵

  3. Rehmetjan says:

    I think Python will win at the end.

  4. 子猴 says:

    看完还是没有结果

  5. foobra says:

    java ee呢?ugly but long live!

  6. LD says:

    PHP不能死,很难说我对PHP有什么感情,我都没有怎么用过它,但是我认为PHP是优雅的,简洁的.

  7. ikbear says:

    射手官网测试比较了下php和ror的性能,结果php赢得很彻底阿。

  8. riku says:

    我晕, need to die 和将死明明是两回事嘛,看这翻译的,误人啊。

  9. ayanamist says:

    其实Java只是走错了方向,搞错了宣传口号。其实Java一样可以写的像PHP一样简单

  10. Porco says:

    Worse is Better

  11. airysoar says:

    PHP虽然很脏、很乱。但效率没得说,短时间内死不了吧

  12. 红狐狸 says:

    这个站点niux,好多好文章,作者辛苦了

  13. 叶剑飞 says:

    翻译有问题啊。
    PHP needs to die. 怎么会翻译成“PHP将死”
    应该是“PHP需要被淘汰”

  14. PHP says:

    我觉得PHP还能坚持很长一段时间。= =#

  15. 李勇 says:

    也许,基于 javascript 的 coffee script 可以最终胜出,理由如下:

    1、javascript/NodeJS 有非常好的灵活性(具体见下)和性能
    2、coffee script 继承了 python 的优点,避开了 javascript 的缺点
    3、下一代 javascript 和 coffee script 基本是兼容的

    javascript/NodeJS 的灵活性体现在

    1、时间灵活性。通过非阻塞异步I/O,可以最大化的利用系统资源,减低处理延迟,甚至可以同时并发执行多个异步操作,最终汇总后再向下执行。
    2、数据 scope 灵活性。通过 closure 可以方便的跟踪到当时的环境。
    3、引用的灵活性。无论是变量还是模块引用,都是“实体”的引用,可以对一个实体进行无限制的“命名”,不必强迫 java 似的全局命名空间,可以使用更为简练的别名进行书写代码,代码更加的精炼。正是用于此,javascript 根本就无需重载、也天生支持对象替换。
    4、更简单高效和动态的 prototype 继承支持。

  16. 李勇 says:

    我必须说,java 是一场大骗局:

    发明 java 不是为了解决实际问题,而是理论空想家的弱智游戏。

    1、applet 昙花一现
    2、EJB 骗人的东西
    3、servlet 然道这不是任何一种语言都可以支持的吗
    4、jsp 不过是几行正则表达式就可以完成的转换吗
    5、J2ME 等死了
    6、java 桌面程序,用它开发的程序都那么的笨重,使用那么的不方便。
    。。。然后 java 就想着增加更多的特性、库、框架,直到把程序员累死。

  17. 86cc says:

    我只是还没学= =

  18. 恩哈哈 says:

    只要有wordpress,joomla,drupal,PHP就还是猪脚。

  19. 奇灵异 says:

    随着客户端技术的发展,不认为还应该存在服务器端脚本,服务器端应该向着仅仅作web服务器发展,以后服务器的作用仅仅是给客户端用户提供下载静态资源的作用,其他的事情全交给客户端浏览器和服务端程序(这里的服务端程序,可以使c可以是c++,可以是任何语言,只要你愿意),所以像php,这样的服务器端脚本,如果是为做web而生的话,以后真的可以没有了

  20. emil says:

    ruby on rails的性能有这么不堪?什么原因?

  21. coos says:

    Perl里有hash。

  22. c says:

    就我个人而言,非常不喜欢javascript,至少我在博客程序编写里尽一切可能避开js。
    当然有些网页处理比如批量上传,不得不使用js来处理,但js代码编写要比php复杂得多。
    就拿面向对象来说,非常不利于初学者理解和使用,我现在也不能彻底明白它到底是什么意思。
    而且固定的框架模式会大大降低初学者和编程人员的积极性、创造性,固定套路是危害无穷的。
    很难找到一种像PHP一样的语言如此易于学习、理解、配置、使用,我相信PHP还能走很长一段时间。

  23. 安德范  这篇文章
  24. 1 对这篇文章的反应是垃圾
  25. 李本富  这篇文章
  26. 胖子 says:

    别丢人现眼了 原文用随便一个翻译网站都比你翻的准确

  27. java says:

    看着译文确实看得好吃力,翻译得太生硬了

  28. teemo says:

    PHP是世界上最好的语言

发表评论

电子邮件地址不会被公开。 必填项已用*标注