记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 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,写完只要编译没报错,基本上都没问题。
1
yafoo 2020-04-01 22:31:38 +08:00 via Android 1
各有优缺点吧,有些人喜欢自由,有些人喜欢被束缚。
|
2
salamanderMH 2020-04-01 22:35:51 +08:00 via Android 1
把 PHP 的手册背下来的也。。。面试挺随机的,我觉得这种问题。。
|
3
fox0001 2020-04-01 22:36:17 +08:00 via Android 1
PHP 内置函数名称最为要命,无章可循…
|
4
puzzle9 2020-04-01 22:39:49 +08:00
这种事情是吧
如果站在圈外 自然看的明白 如果站在圈内 也不觉得迷糊 |
5
iConnect 2020-04-01 22:45:33 +08:00 via Android
弱类型项目大了之后,确实缺乏一种安全感。
|
6
0DBBFF 2020-04-01 22:47:37 +08:00 5
"写 PHP 的时间越久你就会发现 PHP 的弱类型带来的好处远远大于坏处"
|
7
aloxaf 2020-04-01 22:50:35 +08:00 1
我也觉得弱类型毫无意义(注:弱类型!=动态类型),不只是维护的问题,还有安全性的问题
不过这个面试题…… P.S. php 7 其实也有 strict mode 了 PP.S. 我感觉 LZ 很适合学 Rust (笑 |
8
Felldeadbird 2020-04-01 22:50:43 +08:00
好处远远大于坏处,项目写到最后几乎无法维护
既然好处大于坏处,项目怎么最后无法维护呢?奇怪的 BUG ?前端传递 1. 结果 PHP 接收到的 其他值? 感觉楼主没突出转 GO 的重要性啊。 |
9
masker 2020-04-01 22:52:26 +08:00 via Android 2
你就是为了转而转,说的那么冠冕堂皇
|
10
dcsite 2020-04-01 22:54:00 +08:00 19
PHP 是无辜的,弱类型语言
可恨的是出这种面试题的人,建议你反问他:你知道茴香豆的茴字有几种写法吗? |
11
crella 2020-04-01 22:56:46 +08:00
python 和 ruby 不都是动态强类型吗?
type('text') => class 'str' 'text'.class => String |
12
Numbcoder 2020-04-01 22:57:12 +08:00 1
不写测试,神仙语言也救不了你
|
13
wangyzj 2020-04-01 22:59:26 +08:00
学到了
|
14
stabc 2020-04-01 23:00:31 +08:00 1
我写 PHP 好多年了,从来没遇到过那种问题。PHP 坑是很多,但是很多你几乎踩不到。新版本的 PHP 也支持 function 的类型定义了。
|
15
hantsy 2020-04-01 23:00:51 +08:00 1
这也能和语言的优劣扯上关系,你应该 PHP 和 Go 都从来没写过测试吧。
|
16
cmdOptionKana 2020-04-01 23:01:21 +08:00
静态语言一大堆,为什么选择 Go ?
|
17
outoftimeerror 2020-04-01 23:03:28 +08:00
写完只要编译没报错,基本上都没问题。
如果是这个特性的话,我觉得 rust 更符合你的期待。 |
18
back0893 2020-04-01 23:03:50 +08:00 1
我觉得你这面试题不是就是茴有几种写法...
|
19
hantsy 2020-04-01 23:04:02 +08:00
PHP 好像 5.6 开始在 OOP 方面就基本和 Java,C#可以站在一条起跑线上,弱类型自己要用,那只说是自己的问题。
|
20
hantsy 2020-04-01 23:05:31 +08:00
大千世界无奇不有,V 站真是一个娱乐网站。
|
21
mcfog 2020-04-01 23:20:40 +08:00 via Android 2
心情极度复杂。要是多年前,我会庆幸又有个半桶水离开 php 圈子了,可是现在写 go 的机会也多了,团队也多了,这样的半桶水在 php 团队里写的代码气味特征明显一眼就能找到,可是混迹在 golang 团队里,好像还真挺难发现的,等发现的时候,可能已经对代码库造成难以承受的破坏了
|
22
blless 2020-04-01 23:29:26 +08:00
我也觉得是这样,Rust 也想学,但是上手难度太高了。
|
23
Dart 2020-04-01 23:32:14 +08:00
面试人傻 B,你嘛。。。
|
24
also24 2020-04-01 23:45:53 +08:00 1
|
25
mamahaha 2020-04-02 00:01:58 +08:00
不想用就没必要再踩一脚了。就像分手的情侣,好聚好散,藕断丝连会让彼此都痛苦。
|
26
ferock 2020-04-02 00:07:09 +08:00 via Android 4
但是用 GO,写完只要编译没报错,基本上都没问题。
看来你写的 go 也不咋地 |
27
ericgui 2020-04-02 00:08:37 +08:00 1
面试官是个神经病
|
28
sagaxu 2020-04-02 00:10:20 +08:00 via Android
天呐,7 个 count,我一个都答不上来,我只会 count 数组
|
29
Varobjs 2020-04-02 00:10:59 +08:00 via Android
这么说, 也可以转 Java 啊
|
30
tourist2018 2020-04-02 00:14:45 +08:00
碰见面试问这种问题的 我会直接怼回去
|
31
nvhanzhi 2020-04-02 00:14:52 +08:00
面试不爽直接怼回去就行了,反正以后再也难见面!
|
32
yunye 2020-04-02 00:49:35 +08:00 via Android
现在转个语言也要全网声明了?
|
33
JJstyle 2020-04-02 01:07:48 +08:00 via iPhone 1
最讨厌这种面试题,这种 count 有啥意思
|
34
zhuzhibin 2020-04-02 01:33:51 +08:00
我知道了 你因为无非强类型 所以转了 go,那为什么不转 java 还有其他??
|
35
lithbitren 2020-04-02 02:05:09 +08:00
目前最满足主楼最后一句话的只有 rust,其他语言都达不到 rust 的程度,rust 虽然也不完全保证,不过应该是知名语言里最能令人跳脚的。
|
36
halo117 2020-04-02 03:59:39 +08:00 via iPhone
转语言以后,不信不会有新坑,提升编码姿势水平才是关键,大道至简语言也有一些茴字有几种写法的面试问题
|
37
love 2020-04-02 06:42:17 +08:00 via Android
这种面试官怕是脑子有坑,你也可以反问它另外一个函数给它异常输入结果是啥
|
38
ben1024 2020-04-02 08:31:34 +08:00
面试题挺糟糕,换个语言的理由也挺糟糕
|
39
phpcxy 2020-04-02 08:49:00 +08:00
不用写测试的?
|
40
LokiSharp 2020-04-02 09:00:32 +08:00
你用了 Go 之后会发现,其实 Go 也不咋地
|
41
php01 2020-04-02 09:02:45 +08:00 5
基本上可以认定为人的问题。
php 写的好的,写 go 也不会有问题。 php 写的不好的,写 go 也会有问题。 反之亦然。 |
42
AngryMagikarp 2020-04-02 09:03:02 +08:00
这种情况在 Python 上也有。
因为一个大型项目参与的人一定很多,而人员之间水平参差不齐,弱类型确实更容易导致混乱。注意这个“更”字,这是相对的。 PHP 是世上最好的语言。 |
43
yvescheung 2020-04-02 09:05:44 +08:00
这真的是为了面试而面试了,我知道茴香豆有几种写法但是我也成不了鲁迅
|
44
2379920898 2020-04-02 09:07:37 +08:00
你不如转个客户端,后端语音只是一种工具,学到不同的思路才能恒久远
|
45
skys215 2020-04-02 09:12:14 +08:00 1
> "就一下子被问到了,只怪自己基础不扎实,没把 PHP 的手册背下来"
换了 go,基础就扎实了吗,就不用背手册也能通过面试了吗 |
46
dongisking 2020-04-02 09:21:57 +08:00
1,1,1,1,0,报错(没答对)。我看了一下好像也没多难啊
|
47
qq1340691923 2020-04-02 09:23:52 +08:00
不建议转 go 真的。。
|
48
qsnow6 2020-04-02 09:24:29 +08:00
不写测试的锅,不要怪弱类型语言
|
49
everhythm 2020-04-02 09:27:19 +08:00 2
这种题目你仔细想想,不是有病么
早在 c++ 面试题年代,就有诸如 n = ++i+i++; 问你 n 和 i 值的题目 我为什么不写成 i+=1; n+=i; i+=1; n+=i; ? 是个正常人,根本不会这么写代码,我有健壮的符合工程的代码写法,为什么要研究这种刁钻且无用的写法? |
50
qq1340691923 2020-04-02 09:29:07 +08:00
go 也就比 php 好一点,不如搞 java
|
51
KasonPasser 2020-04-02 09:30:38 +08:00 2
新的 PHP 版本中只能 count 数组。
|
52
zjsxwc 2020-04-02 09:31:38 +08:00
go 就是没有泛型不爽,什么时候有泛型就完爆别的 GC 语言了
|
53
jin7 2020-04-02 09:32:36 +08:00
不推荐 go 语言
|
55
Still4 2020-04-02 09:47:15 +08:00
说下我转 go 的原因,php 的多线程太弱了,线程之间内存不共享我要你干什么
|
56
Godikov 2020-04-02 09:49:42 +08:00
病句,去掉“的原因”。
|
57
ericguo 2020-04-02 09:50:17 +08:00 1
现在从 PHP 转 Go 不是新闻,从 Go 转 PHP 才是新闻。
|
58
tt67wq 2020-04-02 09:52:21 +08:00 2
我司正在从 go 转向 php
从鄙视链的高层走向底层 |
59
fenglangjuxu 2020-04-02 10:01:56 +08:00
Warning: count(): Parameter must be an array or an object that implements Countable
除了最后一个 全是这个报错 这是什么脑残面试题啊 PHP 7.3.11 (cli) (built: Dec 13 2019 19:21:21) ( NTS ) 始终坚信:php 是世界最好的语言~ |
60
fenglangjuxu 2020-04-02 10:03:26 +08:00
但是是有结果的 如果屏蔽报错
|
61
qq1340691923 2020-04-02 10:03:36 +08:00
@tt67wq 什么原因
|
62
jswh 2020-04-02 10:04:17 +08:00
所以你怎么不选 Rust ?那个才是编译不报错,连 bug 都几乎没有啊。
说到底,还是钱。如果 PHP 给钱多工作好找,还会转 go 么? |
63
zjsxwc 2020-04-02 10:04:23 +08:00
@sagaxu
go 的 channel csp 编程模式对于处理高并发心智负担更小,比用多线程各种锁处理同步编程的要求低,水平不高的开发者也能快速出活且稳定可靠。 至于 GC,都用 GC 了,GC 性能在可以接受范围内都一样,要实时低延时,当然是直接用无 GC 的 rust 和 c/cpp 去, ~~“我都穷的吃泡面了,你跟我来谈健康? ”。 没有泛型的问题就导致了,go 写业务没有 java 快,当然更不能和 php 比写业务的效率了,所以目前我的看法 go 在业务搬砖领域还是不推荐,挺适合写基础设施的。 |
64
tt67wq 2020-04-02 10:12:05 +08:00
@qq1340691923 #61 接了百度的二手外包,已经是用 php 写的烂尾项目了,烂尾+ php, 我简直要原地升天
|
65
keepeye 2020-04-02 10:12:54 +08:00
面试官估计也就不超过 3 年经验吧,会问这种问题不奇怪
|
66
jy28520 2020-04-02 10:13:41 +08:00 1
coun 是查询数组的长度或是实现了 Countable 接口的对象的
如果不是这两个会转换成这个实现接口的 如果转换的过程中会相当于装箱成一个数组 null 是个特殊的对象 其他的都会转换成 array(原始值) |
67
zjttfs 2020-04-02 10:13:51 +08:00 1
php , go ,py ,rust 依然主力 PHP...
|
68
dapang1221 2020-04-02 10:17:14 +08:00
业务代码里你去 count 一个 undefinedVariable 就离谱,这破题还不如手写反转红黑树
|
69
Tomorrowxxy 2020-04-02 10:17:30 +08:00
@fenglangjuxu #59 7.2 以后就只能 count 数组或对象了
|
70
way2create 2020-04-02 10:20:14 +08:00
觉得面试问这种问题很弱智
|
73
bravist 2020-04-02 10:26:18 +08:00
动态类型与静态类型语言有一定的区别,主要看应用场景,解决问题的复杂度,时间成本等等
用了多年的 PHP 开发,必须要掌握一门动态语言,对比之后你才发现各自的优劣(这是从语言设计的本身角度讲) |
74
davidyanxw 2020-04-02 10:26:43 +08:00
1.面试题目技术含量不高,照实说我觉得不算错
2.弱类型语言都有类似的问题,再加上不习惯写单元测试。 大项目就不太可控,如果单元测试覆盖的全,很大程度上会改善项目质量 |
75
MengiNo 2020-04-02 10:33:22 +08:00 1
@dapang1221 很正常 因为 PHP 怎么写都不会报错最多给 0 值的特性,我都不知道多少次在祖传代码里发现 整段函数里一次都没出现的变量,好好的被 count 、explode 、foreach 甚至 array_merge 一下了。显然是不知道经了多少手,其中一手的人改了什么东西,把这个变量删了。而 PHP 这种情况下 一不会 fatal, 二会自动取 0 值,所以大概率最终计算结果是对的,所以改的人没注意,后续维护的人没发现或者干脆也不想碰,就这样留下来了。
虽然我个人认为这是 PHP 一个非常不好的一点,导致 PHP 真的是乱写都可以跑。虽然 count($undefinedVar)没人会故意想这么写。但话又说回来,万一维护到后期出现奇奇怪怪的情况的话,如果你比较熟练的知道可能是因为某些莫名其妙的写法造成的话,就能对排错节约大量时间。考官这样问应该不是考基础的什么 countable 之类,反而像是考进阶(非得圆的话 2333 ) |
76
qce7 2020-04-02 10:46:26 +08:00
count() 一个字符串我在支付宝的 PHP SDK 代码中见过,这种神仙用法不想吐槽了
|
77
killerv 2020-04-02 11:16:30 +08:00 1
我使用 PHP 和 Go,但是我感觉这个题目没什么意义,我想不到 count 非 Countable 的使用场景,当然你可以说返回值不一定是预期类型,但是 PHP7.2 之后 count 字符串之类的会报错。
PHP 的优点也是缺点,很多人都是初识 PHP 的时候会觉得这玩意上手真快,后期维护的时候发现了这种快带来的问题,然后又开始抨击。还是应该客观看待吧,PHP 有他的使用场景,而且项目的健壮性和使用者水平有很大关系。 |
78
whoami9894 2020-04-02 11:49:52 +08:00
直接怼回去啊,对面试官说:问这种问题,你的水平可想而知
|
79
crella 2020-04-02 11:56:24 +08:00 via Android
@chizuo 我是看 https://blog.csdn.net/sgs595595/article/details/83986580 里的编程语言分类图的。
|
80
CSM 2020-04-02 12:01:33 +08:00 via Android
吐槽一下标题。
从 PHP 转向 Go 的原因 -> PHP 是弱类型 为什么从 PHP 转向 Go 的原因 -> 为什么(从 PHP 转向 Go 的原因) -> 为什么 PHP 是弱类型 可见“为什么……的原因”是个二级的原因。 |
81
crella 2020-04-02 12:07:32 +08:00 via Android
@bravist 之前专门比较过过 php5 与 js py3 ruby golang c#的闭包,刚才又看了看 php7.4 的闭包。发现 php 设计的水平真的是低于平均线……
|
82
SummerWQM 2020-04-02 12:23:13 +08:00
7 的版本 已经强制要求传入 数组类型了
|
83
wangbenjun5 OP |
84
wangbenjun5 OP |
85
barbery 2020-04-02 12:36:59 +08:00
再过一段时间,楼主遇到了继承、reflect 的问题,然后“这就是我为什么从 go 转回 php 的原因”
|
86
hantsy 2020-04-02 12:40:29 +08:00
@wangbenjun5 我们思维不在一个体系的。在我概念中,写测试是必不可少的,是 CI,CD,自动化的基础,最近几年我参与几乎所有的项目都要求写测试。
|
87
wangbenjun5 OP @MengiNo 对的,PHP 的解释器非常“智能”,经常给你自动做一些类型转换或者骚操作
|
88
wangbenjun5 OP @hantsy 测试是测试,php 能写测试 go 难道就不能写了吗,你写再多测试就避免 count 的谜之返回结果了吗?
|
89
justfortest 2020-04-02 12:58:06 +08:00 via Android
|
90
hantsy 2020-04-02 12:59:25 +08:00
@wangbenjun5 不讨论,好吧。你还在用 PHP 弱类型为主,我最后一次写 PHP 的项目就全部 OOP,用强类型,那都好多年前了。
|
91
odirus 2020-04-02 13:05:22 +08:00 1
前期的技术选型很重要,最好有前瞻性的思考。
刚开始起步要求快用 PHP 无可厚非,团队上来了就用编译型语言如 Java 等适合协作,新旧系统之间用 RPC 来打通,慢慢的把就老系统过渡到新系统,团队足够强的话也可以考虑引入 ServiceMesh 来屏蔽语言差异。 这样看来前期最重要的就是开放给外部的接口(例如提供给客户端的或者三方的)一定要有较好的扩展性;当内部有互相调用的时候要制定好系统之间的接口调用规范,也要有较好的扩展性,协议最好是跨语言的,可能会牺牲掉一些性能,但以后方便扩展到多语言生态。 总之,制定好服务与服务之间的接口规范,服务与外部系统的接口规范,以后内部随便怎么折腾都没关系。 我们这边的发展路线就是 PHP -> JAVA 、PHP (当时用的 Thrift ) -> Java -> 未来可能会引入 ServiceMesh 概念来拥抱多语言开发生态 |
92
sunznx 2020-04-02 13:07:35 +08:00
我想转 go 是因为 php 找不到工作
|
93
sunznx 2020-04-02 13:09:36 +08:00
另外,如果面试官问我这个问题,我会觉得他是傻逼,给我 50k 我就会和他一起干活
|
94
areless 2020-04-02 13:26:18 +08:00 via Android
没必要计较语言的优劣,人家就是这样设计的,任何语言都可以 ffi 的~~~这几年 php 转 go,过几年 go 转 lua,再几年 python 转 ruby 年轻人太过浮躁。09 年 go 出来时同行都说 php 转 go,我觉得大部分项目用不到 go ~何况现在 php 也可以 ffi
|
95
laravel 2020-04-02 13:26:45 +08:00
做什么项目,用什么语言,没有说什么项目和要求,讨论语言没意义吧。
|
96
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 才行,求问一下这个真的没办法解决吗 |
97
niucility 2020-04-02 13:42:46 +08:00
@Tomorrowxxy 补充一下: 对象需要实现 Countable
|
98
encro 2020-04-02 13:46:26 +08:00 1
@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]⏎ |
99
lepig 2020-04-02 13:48:39 +08:00
深有同感 不过目前靠 PHP 吃饭 就这样吧
|
100
crystom 2020-04-02 13:50:18 +08:00
@winterfell30 空的时候让 php 转成 (object)[] 再进行 json 编码
|