不知道什么时候“PHP是最好的编程语言”成为了对PHP本身最大的戏虐。很多人似乎很不屑,甚至蔑视使用PHP的人。似乎他只是一个玩具,简单、混乱、不成气候。这使得我这样一个小phper有时候会觉得自己就像一个在大人面前活尿泥的孩子,很菜,很不专业。
今天,我不想听编程的核心,不想听思想、理论知识等与语言本身无关的东西,因为道理我都懂。我就想知道,在你们心中客观的讲,PHP究竟有多糟糕?
作者:贺师俊
PHP 有多糟糕,简单说,PHP 是主流工业语言里最糟糕的。
看看 Swoole 的作者韩天峰怎么评价的:
PHP 语言有 20 多年的历史,由于一直保持向下兼容。存在很多糟糕的地方,比如:
- 混乱的函数命名
- 不友好的 Array/String 函数,至今数组和字符串的操作都没有实现 OO 接口
- 混乱的参数顺序,导致完全记不住一个函数的用法,每次需要查手册或借助 IDE
- 难用的 Zend API ,导致了在应用与内核之间,很难有一个中间层。比如 Node.js 做的就很好,它提供的 C++ API 可以让其他 C++ 程序员很方便地为 Node 编写扩展模块。而 Zend API 几乎就是地狱模式,对开发者要求太高了。我在今年新开发的 PHP-X 就是为了解决这个问题
- 缺乏异步 IO 网络层,PHP 官方只提供了 sockets、stream、select 等 IO 函数,无法满足现在大并发时代的需求。所以就有了 Swoole 这个项目
- 缺乏对多线程的支持,虽然有一个 pthreads 项目,但这个连玩具都算不上。多线程需要 PHP 语言底层进行支持,而 PHP 设计之初就没考虑过多线程
当然,PHP 也有明显的优点,比如其部署对于虚拟主机的友好超过(除了古老的 ASP 之外的)所有其他主流语言,因此在互联网应用爆发初期就占领了巨大市场,一些世界上最大的网站最初(甚至至今)都是 PHP 写的,这是其至今屹立不倒的核心原因。
如韩天峰所言,PHP 的糟糕主要源自于历史包袱。
或曰,其他语言也有历史包袱呀?确实,但是 PHP 的历史包袱特别严重。
这有几个原因。
第一,PHP 最初设计(相比其他编程语言)就很不专业。尽管 Rasmus 是个很优秀的程序员,但是语言设计方面不是他所专长,而且一开始他根本没有打算做个语言,而只是给自己个人使用的简单工具集。这些历史可以自行查阅 Rasmus 的访谈。这导致从设计到实现都有很多临时性的举措。奇怪的大小写设定(PHP黑系列之一:PHP 为什么大小写规则是如此不规则?),函数命名不一致(PHP黑系列之二:PHP 为什么函数命名是如此不一致?)等的根源都是这些未经设计的偶然因素。即使底层代码在PHP3之后就基本重写了,但由于后面提到的原因遗毒至今。
第二,PHP 的后续开发(相比其他编程语言)也缺乏语言设计专家的参与。一些借鉴其他编程语言的新特性虽然总体上还是可用的,但是可能存在微妙的语义问题或实现限制。一些设计错误并没有被修复,反而被延续和扩大。最典型的比如允许函数、常量同名,本来在PHP引入类、接口的时候就应该修正,但结果是允许类、函数、常量同名。这导致当 PHP 发展到今天,常量不能是闭包(Why PHP doesn’t allow anonymous functions inside CONST?),导致命名空间必须用 use const/function 这样脱裤子放屁的语法(这个问题以后我有空会在《PHP黑系列》中单独讲一讲)。一些常用库的设计和改进也全凭运气。比如 JSON 相关的 API 的扩展和变更中出现了明显的失误(主要是由于后续维护者没能理解和保持最初 API 的隐含约束,以后我有空会在《PHP黑系列》中单独讲一讲)。
第三,PHP 社区信奉实用主义。实用主义不是不好,但是过度的实用主义导致 PHP 社区普遍低估其他因素(如编程体验)的重要性。PHP 历史上的巨大成功加剧了这种心理倾向,进一步削弱了改善动力。这可能也造成了对语言改善有想法的人(包括语言设计专家)与 PHP 社区的互相排斥。这反过来恶化了第二点。另一方面,由于 Rasmus 本人并没有领导 PHP 后续开发,也没有像 Python/Ruby/Perl 等语言的创造者那样保留对语言发展关键问题的最后的『仁慈独裁』权力,使得 PHP 后续发展历史上缺少敢于拍板做革命性修正的灵魂人物(所谓革命性修正,如 python3、perl6、ES6 等,注意这里不讨论革命性修正的具体得失)。
其实自从 PHP 5.4 之后,PHP 核心社区在语言改善上是有很多进步的,包括敢于做一些破坏兼容性的修改,开发节奏也比以前要快很多。PHP 7 更是一个非常巨大的改进。我们也看到了很多致力于提升开发体验和解决历史问题的 aggressive 的提案。但是更广泛的 PHP 开发者社区心态上还是没有跟上(此处国外了解不多,主要谈国内)。举个例子来说,本问题下的某个认为『PHP 谈不上有多糟糕』的高赞答主,之前在许多其他涉及 PHP 的问题发出『JIT 也不见得快』的评论。PHP 7 没有做 JIT 的原因,鸟哥解释过。糟糕的是,一些人把鸟哥的解释理解为『PHP 不需要 JIT』,或者『JIT 没用』,并且反以(没有JIT)为荣。实际上真正的原因是 PHP 以前的实现太糟糕了,以至于上了 JIT 也没卵用。在 PHP 7 重写了底层的 zval 之后,现在已经重新上了 JIT 并体现出了可观的性能提升。当然,我是不指望这些人能承认打脸的,他们只会继续拿这些事情来宣扬 PHP 是『最好的语言』。
PHP 社区的问题还表现在缺乏生态多样性。同样是引入静态类型的方言,Hack 的接受程度远远小于 TypeScript(之于 JavaScript)。注意,我不是在讨论 PHP 是否应该引入静态类型,而是在探讨一个世界顶级技术公司对其核心技术资产的推动力。PHP 领域,facebook 已经是顶级玩家。JS 领域,像 facebook 这个等级的,就多得去了。但是 facebook 对 PHP 社区的影响力居然远远不如其对 JS 社区的影响力。可见 PHP 社区的糟糕。我要是 facebook 的技术决策者,早晚是要抛弃 PHP 的(实际上已经开始抛弃了)。
总之,PHP 的糟糕最主要在于很难摆脱历史包袱。糟糕中的糟糕则是,尽管 PHP 核心开发团队确实在不断改进,但更广泛的社区似乎仍然心态保守。