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

17342 次点击
所在节点    程序员
155 条回复
encro
2020-04-02 13:52:14 +08:00
PHP 开发,
首先要做的事就是开启 notice 级别错误,
然后编程时候用 7.0+版本,
所有函数参数,类属性都加上类型,
这样代码提示等都会非常友好。
ideacco
2020-04-02 13:52:32 +08:00
我们公司帮人做过软件开发,然后客户要求我们代码部署到他们的服务器上,然后。。。。。为了防止源代码泄露,我们那个项目就开始用 Go 写了。。。
KasuganoSoras
2020-04-02 14:19:00 +08:00
6 年 PHP 开发路过,看了楼上的回答,无非都是 “弱类型” “函数命名” 的问题,这些是问题么?根本不是。

弱类型问题完全可以自己判断一下,简单点用 === 进行强制类型判断,或者 is_string is_int 等等函数完全可以用来判断类型,还有楼上说的 Key 问题,在 PHP 里面 $arr[1] 和 $arr['1'] 都是一样的。或者如果你想把 PHP 玩成强类型语言,那么,PHP 7.4,请。

函数命名问题呢?觉得函数命名记不住的多半都是框架的受害者,长期使用框架导致记不住内置的函数,但凡是写过一两年原生 PHP 的都不至于记不住内置函数名。例如 LZ 问的面试题,count 除了 null 和 [] 以外,其他值全部都是 1,类似的还有 empty 函数。只有写原生写得多的,踩的坑多了,才会知道这些问题,长期依赖框架的话,各种可能看得见的问题全都被框架自行处理了,剩下你看不到的问题在项目上线运行后就全出来了。

“项目写到最后几乎无法维护”,这是不存在的,只要文档写好,注释写好,没有什么不可维护的项目,以前我经常从一些不正经的开发论坛上找那种什么 PHP 发.卡之类网站源码来自己改,那代码写的真的是屎.山,我都能给它全部改的工工整整而且还修好了一堆的 bug,顺便再套个新 UI,全都是手写原生,不依赖任何框架。

少用点框架,多写点原生,这才是写 PHP 的真谛


对了,我的编辑器是 Np.p,什么 IDE 都没用过,纯靠大脑来语法检查,甚至补全功能都可以不用开。
charlie21
2020-04-02 14:46:43 +08:00
每次调用别人写好的函数都非常不放心
心智负担要小很多

。。。
说白了,这还是无法处理 “遇人不淑 / 猪队友” 的愤怒,和 PHP 又有什么关系
RipL
2020-04-02 14:49:13 +08:00
要说心智负担小应该写 java
Zackkkk
2020-04-02 14:53:14 +08:00
你的吐槽,得出结论:搞 Java
dV9zZM1wROuBT16X
2020-04-02 14:56:48 +08:00
脚本语言都有这种问题,尤其是 php,一个方法返回的结果可能有无数种,上层各种 if/else 判断,一个文件上万行代码,根本没有设计 /维护可言
vitoliu
2020-04-02 14:57:35 +08:00
@KasuganoSoras 说的真厉害,佩服
mokeyjay
2020-04-02 15:45:04 +08:00
@KasuganoSoras #103 补全都不开?那是真的牛逼
KasuganoSoras
2020-04-02 15:48:45 +08:00
@mokeyjay #109 以前还在用记事本写代码的时候连语法高亮都没有,更别提什么补全了,时间长了已经习惯了
yxzblue
2020-04-02 15:58:45 +08:00
@KasuganoSoras 说的真真厉害
LokiSharp
2020-04-02 16:07:28 +08:00
@KasuganoSoras #110 哈哈,我想起了以前直接在 WordPress 编辑器里折腾主题和插件的样子
KasuganoSoras
2020-04-02 16:13:50 +08:00
@LokiSharp #112 我最早写 PHP 的时候是因为想给自己 Minecraft 服务器做个官网,那时候哪知道什么 IDE,高级编辑器,拿个 Windows 记事本就开始写了,写了半年多才有人告诉我有 Np.p 这种东西,然后就一直用到现在了
paoqi2048
2020-04-02 16:39:15 +08:00
go,🏊‍滴神!
uxff
2020-04-02 16:56:55 +08:00
@KasuganoSoras 你有没碰到大量的函数看似返回值一致但是返回值不一致,弱类型的返回值导致你开发过程对返回值猜测的太心累。别人的类接口上注释不好的时候,你必须运行一次才能知道返回值。而在强类型语言下,ide 能帮你快速解决这些问题。
uxff
2020-04-02 17:01:11 +08:00
楼主说的,所有弱类型语言都有这个通病。开发 js 项目,python 项目,lua 等,都很头疼,发现 ide 再强大也无法猜测你的返回值。
有人说是函数类接口注释写的不规范。这些东西的约束,真不如用强类型语言来帮你约束,编译过程强制约束让开发者遵守。
强类型语言开发过程中 ide 提示会让效率提高很多很多,不心累。
我认为开发效率还是强类型更高更舒服。
abcbuzhiming
2020-04-02 17:03:33 +08:00
@KasuganoSoras
现代编程的真谛,说白了就是逐步把一些以前要求很高的编程需求,变成让大部分工具人也能干的活。所以,“纯靠大脑来语法检查,甚至补全功能都可以不用开”,厉害吗?当然厉害,这是你的父母给你馈赠了一个厉害的大脑。但是如果我站在你面前,听到你这么描述你正在做的事情,我一定会嘴上夸奖你,然后一定想方设法把你换掉,因为你是一个巨大的风险——很多人不具备你有的这种天然的能力,项目严重的依赖着你的个人能力,屎山都能改好的人确实牛逼,但是这也意味着这个项目离了你就玩不转了,那这不是巨大的风险是什么呢?

为啥现代编程工程化越来越不喜欢动态语言,为啥前端 js 也被 ts 替代,说白了,就是要消灭这种风险。所以,你夸耀的能力,反而进一步暴露了,PHP 确实有这样的问题
Rwing
2020-04-02 17:05:59 +08:00
C# 你值得拥有
KasuganoSoras
2020-04-02 17:20:01 +08:00
@abcbuzhiming #117 没错,所以我除了写 PHP 以外,还去学了 Java 学了 Go,三种语言混着用,前所未有的舒适。PHP 负责做网页端,Go 处理高并发,Java 做通讯,写 API 。PHP 确实有一些缺点,不过只要有适当的技巧,就能把缺点利用起来。当然,也可以像我一样,用其他语言来填补 PHP 的不足,实现灵活开发 + 省时省力。

“但是这也意味着这个项目离了你就玩不转了” 所以我成了管理和策划整个项目的人 🐶
Sapp
2020-04-02 17:25:18 +08:00
js 也有这种奇葩问题,但是现在貌似已经没什么人问了

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

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

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

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

© 2021 V2EX