这就是我为什么从 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,写完只要编译没报错,基本上都没问题。

17340 次点击
所在节点    程序员
155 条回复
crella
2020-04-02 12:07:32 +08:00
@bravist 之前专门比较过过 php5 与 js py3 ruby golang c#的闭包,刚才又看了看 php7.4 的闭包。发现 php 设计的水平真的是低于平均线……
SummerWQM
2020-04-02 12:23:13 +08:00
7 的版本 已经强制要求传入 数组类型了
wangbenjun5
2020-04-02 12:34:09 +08:00
@0DBBFF
@Felldeadbird 手误,打错了
wangbenjun5
2020-04-02 12:36:16 +08:00
@hantsy
@phpcxy
@qsnow6

测试是非必须的,而且也不能完成 cover 到,靠测试岂不是有点南辕北辙
barbery
2020-04-02 12:36:59 +08:00
再过一段时间,楼主遇到了继承、reflect 的问题,然后“这就是我为什么从 go 转回 php 的原因”
hantsy
2020-04-02 12:40:29 +08:00
@wangbenjun5 我们思维不在一个体系的。在我概念中,写测试是必不可少的,是 CI,CD,自动化的基础,最近几年我参与几乎所有的项目都要求写测试。
wangbenjun5
2020-04-02 12:41:17 +08:00
@MengiNo 对的,PHP 的解释器非常“智能”,经常给你自动做一些类型转换或者骚操作
wangbenjun5
2020-04-02 12:44:52 +08:00
@hantsy 测试是测试,php 能写测试 go 难道就不能写了吗,你写再多测试就避免 count 的谜之返回结果了吗?
justfortest
2020-04-02 12:58:06 +08:00
hantsy
2020-04-02 12:59:25 +08:00
@wangbenjun5 不讨论,好吧。你还在用 PHP 弱类型为主,我最后一次写 PHP 的项目就全部 OOP,用强类型,那都好多年前了。
odirus
2020-04-02 13:05:22 +08:00
前期的技术选型很重要,最好有前瞻性的思考。

刚开始起步要求快用 PHP 无可厚非,团队上来了就用编译型语言如 Java 等适合协作,新旧系统之间用 RPC 来打通,慢慢的把就老系统过渡到新系统,团队足够强的话也可以考虑引入 ServiceMesh 来屏蔽语言差异。

这样看来前期最重要的就是开放给外部的接口(例如提供给客户端的或者三方的)一定要有较好的扩展性;当内部有互相调用的时候要制定好系统之间的接口调用规范,也要有较好的扩展性,协议最好是跨语言的,可能会牺牲掉一些性能,但以后方便扩展到多语言生态。

总之,制定好服务与服务之间的接口规范,服务与外部系统的接口规范,以后内部随便怎么折腾都没关系。

我们这边的发展路线就是 PHP -> JAVA 、PHP (当时用的 Thrift ) -> Java -> 未来可能会引入 ServiceMesh 概念来拥抱多语言开发生态
sunznx
2020-04-02 13:07:35 +08:00
我想转 go 是因为 php 找不到工作
sunznx
2020-04-02 13:09:36 +08:00
另外,如果面试官问我这个问题,我会觉得他是傻逼,给我 50k 我就会和他一起干活
areless
2020-04-02 13:26:18 +08:00
没必要计较语言的优劣,人家就是这样设计的,任何语言都可以 ffi 的~~~这几年 php 转 go,过几年 go 转 lua,再几年 python 转 ruby 年轻人太过浮躁。09 年 go 出来时同行都说 php 转 go,我觉得大部分项目用不到 go ~何况现在 php 也可以 ffi
laravel
2020-04-02 13:26:45 +08:00
做什么项目,用什么语言,没有说什么项目和要求,讨论语言没意义吧。
winterfell30
2020-04-02 13:34:37 +08:00
我是 C++后端,PHP 用的比较少,不过有时会和 PHP 后端对接,就我的感觉在对接上 PHP 确实问题多一点,随便举两个例子
1.接收 PHP 后端下发的 json 数据,一个字段非空的时候是正常字典,空的时候就变成 array 了,虽然可以代码上兼容,但是还是感觉挺难受
2.PHP 后端来请求 C++下发的 json 数据,我的字典 key 是 id 形式的,比如"1","2"这种,PHP 那边接收到就会有问题而且说没办法解决,最后我把 key 都改成了 st_1,st_2 才行,求问一下这个真的没办法解决吗
niucility
2020-04-02 13:42:46 +08:00
@Tomorrowxxy 补充一下: 对象需要实现 Countable
encro
2020-04-02 13:46:26 +08:00
@winterfell30

因为 PHP 并没有区分字典和数组,
JSON 序列化和反序列化的时候,是通过判断 index 是不是数字 0 开始来判断字典还是数组。所以你如果将 key 转为非 0 开始,那么它就当成字典了。

>>> echo json_encode([1=>2,2=>3]);
{"1":2,"2":3}⏎
>>> echo json_encode([0=>2,1=>3]);
[2,3]⏎
>>> echo json_encode(['0'=>2,'1'=>3]);
[2,3]⏎
lepig
2020-04-02 13:48:39 +08:00
深有同感 不过目前靠 PHP 吃饭 就这样吧
crystom
2020-04-02 13:50:18 +08:00
@winterfell30 空的时候让 php 转成 (object)[] 再进行 json 编码

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

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

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

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

© 2021 V2EX