不知道什么时候“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 核心开发团队确实在不断改进,但更广泛的社区似乎仍然心态保守。

PHP到底有多糟糕?相关推荐

  1. qnap raid5升级raid6_实践出真知!100TB的RAID5到底能否重建成功?

    实践出真知!100TB的RAID5到底能否重建成功? 2019-04-04 18:40:37 390点赞 996收藏 419评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励 ...

  2. 过度的焦虑 到底有多糟

    你们知道过度的焦虑到底有多糟糕吗? 现在生活节奏越来越快,不管是生活.工作还是学习,很多方面都给我们带来了很多的压力问题,我们所承受的负担越来越重,很多人时常处于一种非常疲劳.过度的焦虑的状态. 你们 ...

  3. 输出不详宗教预言,Google翻译为何“水逆”了?

    最近,一些网友使用的 Google 翻译"水逆"了. 在 Reddit 上,有网友截图显示,在 Google 翻译中当某些语种的词汇翻译成英语时,输出的却是毫无由头的宗教语言.比如 ...

  4. 面向 CPython GIL 的多线程编程要点

    目录 文章目录 目录 Python GIL Python GIL 对线程并发性能的影响 保留 GIL 的历史原因 为了兼顾解释型语言的简单 为了兼顾 C 程序库的安全 Python 的多线程编程要点 ...

  5. 转载-IronPython入门:什么是IronPython?

    IronPython入门:什么是IronPython? http://developer.51cto.com  2009-10-15 09:32  康凯 编译  51CTO.com 我要评论(0) 本 ...

  6. IromPython .Net 的简介和第一个例子

    .Net 4 都已经到来了,早就该去了解IronPython和IronRuby了,回头再去研究一下F#. 一.IronPython的起源 您可能会问:什么是IronPython?简单地说,IronPy ...

  7. 博弈论:别人的想法(文末送书!)

    本文节选自<算法之美:指导工作与生活的算法> 中信出版集团,2018年05月出版 我是一个乐观主义者,我相信人类是高尚和可敬的,而且他们中的一些人真的很聪明--我对群体中的人有一些比较悲观 ...

  8. 思科CEO钱伯斯的动荡一年:往事不堪回首

    钱伯斯和思科的2011年动荡不安 导语:一年下来,硅谷大佬有人欢笑有人哭,向隅而泣的人当中自然少不了思科CEO约翰·钱伯斯(John Chambers).美国科技博客BusinessInsider撰稿 ...

  9. 大数据总监python可视化分析30W数据后,找到了抹黑我们的原因

    真利益相关,人在国内,刚下...算了,在办公室. 我不知道是谁在推特上抹黑我们,我也不想知道他们为什么这么对待我们,作为大数据行业的一员,我觉得什么东西都得有数据来证明对吧,如果靠嘴的话,那对面早就赢 ...

最新文章

  1. php 操作数组 (合并,拆分,追加,查找,删除等)
  2. 注册表 ControlSet001、ControlSet002以及CurrentControlSet
  3. n个节点的二叉树n+1_使用C ++程序将链接列表中的最后N个节点附加到第一个
  4. 自由软件之父Richard Stallman及其思想
  5. 米勒-拉宾质数判断证明
  6. Win11更新失败错误代码0x8007000d怎么办?
  7. 参与openEuler社区不到1年,我成为了社区Maintainer……
  8. What’s difference between 1’s Complement and 2’s Complement?
  9. 如何理解接口隔离原则?
  10. android加密设备,用于Android手机的加密设备和加密外部SD卡
  11. 登录注册功能的实现详解(多用户名注册、案例补充)
  12. 数字电子技术基础(上)
  13. 26对称矩阵及正定性
  14. asp.net简单介绍(还有完整项目资源可以下载)
  15. 提高效率和质量——生产车间6S管理
  16. SpringAOP超详解!!!!
  17. 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理...
  18. 精简centos7.7内核版本升级
  19. 浪潮服务器5112面板灯_浪潮英信服务器SA5112M5
  20. 这就是搜索引擎——搜索引擎索引(1)

热门文章

  1. MediBangPAIntPro for Mac v24.0版对系统要求有哪些
  2. EasyRecovery15macOS苹果电脑数据恢复软件
  3. android7.0版本手机,简直神速 安卓7.0新版本发布 老款安卓手机照样流畅运行
  4. Java命令里面的EQ、NE、GT、LT、GE、LE分别代表含义
  5. ##Java 字母大小写比较
  6. pinpoint mysql_APM监控之Pinpoint使用心得
  7. c语言编译是灰的,编译灰鸽子打造自己专用版C
  8. NTP时钟服务器(NTP网络时钟系统)配置说明方法
  9. [图像处理]彩色图片转手绘效果
  10. 【vim使用】问题记录,不定时更新