这就是我为什么从 PHP 转向 Go 的原因

2020-04-01 22:22:32 +08:00
 wangbenjun5

记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 PHP 里面 count 的用法连续问了我很多情况下的结果:

count(0);
count('00000');
count("0")
count(1)
count(null)
count("null")
count($undefinedVariable)
...

平时一般只会用 count 去计算数组或集合的元素个数,没想到还有这么多种情况,就一下子被问到了,只怪自己基础不扎实,没把 PHP 的手册背下来。。。

很多 PHP 的内置函数令人非常头疼,很多函数有很多功能、可以接受各种参数,返回的结果更无章可循,相比之下,go 的内置函数就非常简单明了,其参数类型固定,基本上一个函数只干一件事。

在写 PHP 的时候,每次调用别人写好的函数都非常不放心,因为你根本不知道这个函数返回的结果是什么东西,它可能是数组、可能是字符串、也可能是个数字。。。即使函数有注释也不一定可信,这其中有部分原因是因为开发人员水平较差,但是 go 的类型限定保证了一个函数只会返回一个固定类型的结果。

写 PHP 的时间越久你就会发现 PHP 的弱类型带来的好处远远大于坏处,项目写到最后几乎无法维护!而且里面会出现各种各样的奇怪 bug 。虽然说良好的编程习惯和规范可以避免部分情况,但是很多时候你没法通过这点保证。

使用 PHP,一个接口写完,很多时候心里压根没底,但是用 GO,写完只要编译没报错,基本上都没问题。

17347 次点击
所在节点    程序员
155 条回复
fanqianger
2020-04-02 17:52:16 +08:00
据说 facebook 还是用的 php 的变种叫做 hack 。facebook 要你去写 php 你去吗
justfortest
2020-04-02 17:56:20 +08:00
因为动态类型或者弱类型转语言,以为静态类型好维护代码质量高,往往最后被打脸,还是 naive
justfortest
2020-04-02 18:03:20 +08:00
@wangbenjun5 建议你用 go 多些一些测试看看,看看写测试是不是很恶心
dragonbuf
2020-04-02 18:18:43 +08:00
@wangbenjun5 我强行推的 php7.4 。这种 count 直接抛异常,哈哈,心智负担小了不少。省的整天关心这个
gigantic222
2020-04-02 18:28:07 +08:00
在公司 php 和 go 都用,使用 php 主要是因为出活实在太快了,借助框架和一些规范比如参数优先使用类和接口,也能保证项目质量,用 symfony 用出了 spring 的感觉。fpm 这种模式可以在写业务的时候顾虑更少,况且 7 以后的性能显著提升,还可以限制类型。

用 go 类型优势明显,我一般改一个需求直接从源头的 struct 下手,跟着提示报错一步步改过去。最方便是异步编程和与 docker 的契合。用 php 可能你要借助队列或者 swoole 这样的框架,而 go 在语言层面的支持着实给力。go 的一些基础包比如 http,io,sync,encoding 等都巨好用,源码值得一读。测试和部署作为重要的一环,在 go 这里都变得容易了,跨平台的编译,docker,k8s,真香。

当时是学习 MIT 分布式课程入坑,现在觉得没白学啊。。
beidounanxizi
2020-04-02 18:30:54 +08:00
说真的确实 go 心智负担 很小
liuxu
2020-04-02 18:35:45 +08:00
php7 想尽办法优化 zval,相对于 php5 的 zval 是大刀阔斧重构,zend_array 等类型更是绞尽脑汁重新设计,为了提升性能,已经到想到用物理顺序的内存存储链表。

最后到你这里一句话弱类型不好。。。
secondwtq
2020-04-02 19:17:07 +08:00
@liuxu 优化问题和语言问题不要混在一起
就好比一个厨子把自己做的菜”优化“得很好,但是客人不吃肉 /辣椒 /香菜,优化半天白瞎
RRRSSS
2020-04-02 19:18:30 +08:00
其实不是 PHP 和 Go 的比较,是强类型语言和弱类型语言的比较
sagaxu
2020-04-02 21:27:36 +08:00
关于类型系统,可以大概看一下 2010 年之后出现的语言,有几个是动态弱类型的? dart2 不也改成强类型了。

php 的所谓特色,没有一个被人抄了,这还不够说明问题?

假如放弃短平快,按照 oop 方式开发,那写起来跟 java 或 go 之流也没多大区别了,干嘛还用 PHP ? php 所谓开发效率,在 2015 年之后,已经没有明显优势了。
gamexg
2020-04-02 21:38:04 +08:00
动态一时爽,重构火葬场是真的体验过。

对一处代码的修改不知道会影响多少其他代码。
当然完善的测试覆盖能够减小影响,但是又有多少项目能够保证全部细节都覆盖了?

顶级大神能够做到全部人脑搞定,
但是我做不到, 所以我还是老实的用静态类型语言依赖 ide 查找依赖,编译器检查错误吧。
secondwtq
2020-04-02 22:30:20 +08:00
我没学过 PHP,但是我说一点我的观察:楼主所谓的“设计之初就留下的坑”,很大程度上是设计者最开始的动机就有问题。

根据 PHP 的维基百科页面所述 https://en.wikipedia.org/wiki/PHP:
“Early PHP was not intended to be a new programming language, and grew organically, with Lerdorf noting in retrospect: 'I don't know how to stop it, there was never any intent to write a programming language [...] I have absolutely no idea how to write a programming language, I just kept adding the next logical step on the way.'"

可见 PHP 的设计者最开始并不知道该怎样设计编程语言,甚至本来就没想设计一个好语言出来,仅仅是为了满足自己手头的需求。
当然,就算一个人对“设计语言”这件事真正上心,想做一个好语言,而不仅仅是一个短期好用的工具,这个人本身也要有足够的水平。
这两点是一个好语言的最基本前提。PHP 在第一点上摔了,Go 貌似在第二点上摔了。

https://zhuanlan.zhihu.com/p/66349646
yuwangG
2020-04-02 22:55:02 +08:00
Warning: count(): Parameter must be an array or an object that implements Countable in Command line code on line 1
int(1)
xingfu0539
2020-04-02 22:57:38 +08:00
先不说 php,这面试题太 low
jhdxr
2020-04-02 23:22:11 +08:00
@xingfu0539 同感,这种会导致报 warning 的用法,知道不应该这么用就够了,再去深究返回值意义不大。
写项目难道都奔着产生尽可能多的 warning 但程序居然还能正常跑完这种情况去么。。。在违法的边缘试探.jpg
liuxu
2020-04-03 00:20:10 +08:00
@secondwtq 所以我想表达什么意思你就没过脑子理解一下,语言学家们
explore365
2020-04-03 00:33:27 +08:00
PHP 是最好的语言
secondwtq
2020-04-03 02:27:49 +08:00
@liuxu 那不妨把你想表达的意思以更直接(也就是更“傻瓜友好”)的表达表达出来?

我个人的理解,你的意思是楼主对 PHP 的抱怨,是对 PHP 团队工作的不尊重。
我的意思是,PHP (实现)团队在优化方面尽力了,但是无力改变 PHP 语言本身设计的一些问题。用极端点的话说就是,路线错了,知识越多越反动。
楼主也并没有抱怨 PHP 有性能问题,只是觉得 PHP 不适合自己而已。
a132811
2020-04-03 04:09:53 +08:00
你说的这个缺点,在别人眼里就是强大的隐式类型转换,简单、耐操呀。

准确的说,你说的这种问题还不是弱类型的通病,python 也是动态语言,人家可是强类型,只不过不强制类型检查而已。

强类型+类型系统 才能解决这个问题。这方面,动态语言中,我觉得 typescript 做得最好,这个是前端界开发的趋势。

go 的类型系统其实很一般,太简陋了,现在还缺乏泛型、异常以及成熟一点的包管理,现在的 module 还是有问题,无法解决冲突。模块依赖我认为 deno 的 方案最好
xingfu0539
2020-04-03 09:38:56 +08:00
@jhdxr 好多面试官问“回”字有几种写法,不但没意义,还显示自己水平低下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX