PHP到底有多糟糕?
author:一佰互联 2019-03-26   click:149

简介:80%的互联网用PHP是个传播广泛的谣言,实际上原文是这样的“PHP is used by 78.9% of all the websites whose server-side programming language we know.”即:“PHP在所有服务端语言已知的web网站中,占78.9%”。 ...

PHP到底有多糟糕?

80%的互联网用PHP是个传播广泛的谣言,实际上原文是这样的“PHP is used by 78.9% of all the websites whose server-side programming language we know.”即:“PHP在所有服务端语言已知的web网站中,占78.9%”。事实上,PHP是少数几个会在HTTP头中暴露出明显特征的Web编程语言,而其他语言要么显示的是自己框架的名字(如flask),要么干脆就是nginx/squid之类的反向代理的名称。它跟实际上的市场占有率其实毫无关系。 从结果上也可以很容易看出这种局限性:第二名是http://ASP.NET,这同样是一种很容易看出特征的Web技术。可以尝试在 https://w3techs.com/sites/info/youtube.com 中查找下知名的网站,会发现,基本只有PHP语言的网站正确显示了相应的技术。除了HTTP头以外,W3Tech的统计还会识别常见的内容管理工具的源码特征,主要是WordPress之类的,然后会用这种工具的语言来标记这个网站。这些特征主要在基于模板的上一代web中比较有效,而对前后端分离的下一代web基本无效。

PHP到底有多糟糕?

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 这样脱裤子放屁的语法。一些常用库的设计和改进也全凭运气。比如 JSON 相关的 API 的扩展和变更中出现了明显的失误(主要是由于后续维护者没能理解和保持最初 API 的隐含约束。第三,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 核心开发团队确实在不断改进,但更广泛的社区似乎仍然心态保守。

PHP到底有多糟糕?

PHP到底有多糟糕?

本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.yinxi.net学习互联网营销技术请到巅云建站www.yx10011.com。