PHP到底有多糟糕?
不知道什么时候“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到底有多糟糕?相关推荐
- qnap raid5升级raid6_实践出真知!100TB的RAID5到底能否重建成功?
实践出真知!100TB的RAID5到底能否重建成功? 2019-04-04 18:40:37 390点赞 996收藏 419评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励 ...
- 过度的焦虑 到底有多糟
你们知道过度的焦虑到底有多糟糕吗? 现在生活节奏越来越快,不管是生活.工作还是学习,很多方面都给我们带来了很多的压力问题,我们所承受的负担越来越重,很多人时常处于一种非常疲劳.过度的焦虑的状态. 你们 ...
- 输出不详宗教预言,Google翻译为何“水逆”了?
最近,一些网友使用的 Google 翻译"水逆"了. 在 Reddit 上,有网友截图显示,在 Google 翻译中当某些语种的词汇翻译成英语时,输出的却是毫无由头的宗教语言.比如 ...
- 面向 CPython GIL 的多线程编程要点
目录 文章目录 目录 Python GIL Python GIL 对线程并发性能的影响 保留 GIL 的历史原因 为了兼顾解释型语言的简单 为了兼顾 C 程序库的安全 Python 的多线程编程要点 ...
- 转载-IronPython入门:什么是IronPython?
IronPython入门:什么是IronPython? http://developer.51cto.com 2009-10-15 09:32 康凯 编译 51CTO.com 我要评论(0) 本 ...
- IromPython .Net 的简介和第一个例子
.Net 4 都已经到来了,早就该去了解IronPython和IronRuby了,回头再去研究一下F#. 一.IronPython的起源 您可能会问:什么是IronPython?简单地说,IronPy ...
- 博弈论:别人的想法(文末送书!)
本文节选自<算法之美:指导工作与生活的算法> 中信出版集团,2018年05月出版 我是一个乐观主义者,我相信人类是高尚和可敬的,而且他们中的一些人真的很聪明--我对群体中的人有一些比较悲观 ...
- 思科CEO钱伯斯的动荡一年:往事不堪回首
钱伯斯和思科的2011年动荡不安 导语:一年下来,硅谷大佬有人欢笑有人哭,向隅而泣的人当中自然少不了思科CEO约翰·钱伯斯(John Chambers).美国科技博客BusinessInsider撰稿 ...
- 大数据总监python可视化分析30W数据后,找到了抹黑我们的原因
真利益相关,人在国内,刚下...算了,在办公室. 我不知道是谁在推特上抹黑我们,我也不想知道他们为什么这么对待我们,作为大数据行业的一员,我觉得什么东西都得有数据来证明对吧,如果靠嘴的话,那对面早就赢 ...
最新文章
- php 操作数组 (合并,拆分,追加,查找,删除等)
- 注册表 ControlSet001、ControlSet002以及CurrentControlSet
- n个节点的二叉树n+1_使用C ++程序将链接列表中的最后N个节点附加到第一个
- 自由软件之父Richard Stallman及其思想
- 米勒-拉宾质数判断证明
- Win11更新失败错误代码0x8007000d怎么办?
- 参与openEuler社区不到1年,我成为了社区Maintainer……
- What’s difference between 1’s Complement and 2’s Complement?
- 如何理解接口隔离原则?
- android加密设备,用于Android手机的加密设备和加密外部SD卡
- 登录注册功能的实现详解(多用户名注册、案例补充)
- 数字电子技术基础(上)
- 26对称矩阵及正定性
- asp.net简单介绍(还有完整项目资源可以下载)
- 提高效率和质量——生产车间6S管理
- SpringAOP超详解!!!!
- 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理...
- 精简centos7.7内核版本升级
- 浪潮服务器5112面板灯_浪潮英信服务器SA5112M5
- 这就是搜索引擎——搜索引擎索引(1)
热门文章
- MediBangPAIntPro for Mac v24.0版对系统要求有哪些
- EasyRecovery15macOS苹果电脑数据恢复软件
- android7.0版本手机,简直神速 安卓7.0新版本发布 老款安卓手机照样流畅运行
- Java命令里面的EQ、NE、GT、LT、GE、LE分别代表含义
- ##Java 字母大小写比较
- pinpoint mysql_APM监控之Pinpoint使用心得
- c语言编译是灰的,编译灰鸽子打造自己专用版C
- NTP时钟服务器(NTP网络时钟系统)配置说明方法
- [图像处理]彩色图片转手绘效果
- 【vim使用】问题记录,不定时更新