Go 是更好的 PHP
涛叔很多 PHP 程序员转 Go 是囿于当今大环境。今天我给大家带来一个新的观点——「Go 是更好的 PHP」。
还得从PHP showing its maturity in release 7.4这篇文章说起。该文章说 PHP 从7.4这个版本开始走向成熟,文章列举了PHP的如下优点:
完善的面向对象编程支持,主要包括
- namespace 处理命名冲突
- interface 分离实现与接口
- traits 代码混入(mixin)支持
- 类型系统 限制函数参数、返回值、类成员的类型
完善的依赖管理体系,这一点主要由 composer 实现。
支持 FFI(foreign function interface),可以很方便的跟各种C语言库(如 TensorFlow)交互,极大地扩展了 PHP 的能力。
更加安全,主要是引入了更加现代更加安全的密码学类库 libsodium。
性能不断提升,PHP7.4的性能大约是PHP5.6的3倍,比PHP7.0也快了近18%。主要的性能提升来自于PHP7.0的zval重构。而PHP7.4也能过引入 preload 特性进一步加快了代码的执行速度。PHP8.0 将引入 JIT 技术,届时会有更大的提升。
作为一个老PHP程序员,我认为这篇文章只说了PHP的优点,而忽略了PHP的缺点。
- 不支持泛型。程序员无法限制PHP的数组的成员类型。
- 运行时类型检查。PHP的参数类型检查是在代码执行的过程完成的,降低了执行效率。
- 不支持多核。PHP虚拟机就是一个C语言的 while 循环,边读取边执行。如果想跑满多核,只能利用多进程或都多线程,多线程存在同步问题,多进程存在IPC问题。
- PHP本身和扩展都使用C语言开发,要想深入理解PHP,单写PHP代码是不够的。这在一定程度上增加了改进PHP的门槛。
而 Go 语言恰恰是解决了这些问题
- 支持基本的的泛型 slice 和 map 都支持指定类型1
- 编译时类型检查,没有运行时开销
- 基于线程实现协程,先天支持多核
- 使用 Go 语言自举,编译器和运行时本身由 Go 语言加少量汇编语言开发,只要熟悉 Go 语言就可以深入研究编译器和运行时代码
- 支持类型推导,开发体验跟 PHP 这种动态语言类似
Go 语言跟 c 相比确实性能上有不少损失,但跟 PHP 相比基本上可以实现各方面的吊打。如果非要说 Go 有什么不如 PHP 的地方,那就只有社区开方性这一条了。Go 是由 Google 主导开发的,而 PHP 是由社区主导开发的。不过这一条对小公司或者一般开发者影响都不大。
我在大学里就玩PHP,工作后也一直使用PHP作为主力开发语言,曾经也想着用 PHP 开发所有功能,我甚至还为PHP量身打造了一款 vim 开发插件。可 PHP 毕竟不是一门通用语言,最合适的应用场景就是写模版(这部分份额不断被node蚕食)。最终,在一个新项目启动的时候我还是选择了 Go 语言。当然,Go 语言远不只是一个更好的 PHP,但把 Go 当成 PHP 来用,你会对 PHP 和 Go 有不一样的理解。
Go 在 1.18 版本支持完整的泛型,具本参见我的系列文章 ./generics/↩︎