记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 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 ![]() 各有优缺点吧,有些人喜欢自由,有些人喜欢被束缚。 |
2 salamanderMH 2020-04-01 22:35:51 +08:00 via Android ![]() 把 PHP 的手册背下来的也。。。面试挺随机的,我觉得这种问题。。 |
3 fox0001 2020-04-01 22:36:17 +08:00 via Android ![]() PHP 内置函数名称最为要命,无章可循… |
![]() | 4 puzzle9 &bsp; 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 ![]() "写 PHP 的时间越久你就会发现 PHP 的弱类型带来的好处远远大于坏处" |
7 aloxaf 2020-04-01 22:50:35 +08:00 ![]() 我也觉得弱类型毫无意义(注:弱类型!=动态类型),不只是维护的问题,还有安全性的问题 不过这个面试题…… 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 ![]() 你就是为了转而转,说的那么冠冕堂皇 |
![]() | 10 dcsite 2020-04-01 22:54:00 +08:00 ![]() PHP 是无辜的,弱类型语言 可恨的是出这种面试题的人,建议你反问他:你知道茴香豆的茴字有几种写法吗? |
![]() | 11 crella 2020-04-01 22:5:46 +08:00 python 和 ruby 不都是动态强类型吗? type('text') => class 'str' 'text'.class => String |
![]() | 12 Numbcoder 2020-04-01 22:57:12 +08:00 ![]() 不写测试,神仙语言也救不了你 |
![]() | 13 wangyzj 2020-04-01 22:59:26 +08:00 学到了 |
14 stabc 2020-04-01 23:00:31 +08:00 ![]() 我写 PHP 好多年了,从来没遇到过那种问题。PHP 坑是很多,但是很多你几乎踩不到。新版本的 PHP 也支持 function 的类型定义了。 |
15 hantsy 2020-04-01 23:00:51 +08:00 ![]() 这也能和语言的优劣扯上关系,你应该 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 ![]() 我觉得你这面试题不是就是茴有几种写法... |
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 ![]() 心情极度复杂。要是多年前,我会庆幸又有个半桶水离开 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 ![]() |
![]() | 25 mamahaha 2020-04-02 00:01:58 +08:00 不想用就没必要再踩一脚了。就像分手的情侣,好聚好散,藕断丝连会让彼此都痛苦。 |
![]() | 26 ferock PRO ![]() 但是用 GO,写完只要编译没报错,基本上都没问题。 看来你写的 go 也不咋地 |
![]() | 27 ericgui 2020-04-02 00:08:37 +08:00 ![]() 面试官是个神经病 |
![]() | 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 ![]() 最讨厌这种面试题,这种 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 ateros 2020-04-02 09:02:45 +08:00 ![]() 基本上可以认定为人的问题。 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 ![]() > "就一下子被问到了,只怪自己基础不扎实,没把 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 不写测试的锅,不要怪弱类型语言 |
50 qq1340691923 2020-04-02 09:29:07 +08:00 go 也就比 php 好一点,不如搞 java |
51 KasonPasser 2020-04-02 09:30:38 +08:00 ![]() 新的 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 的多线程太弱了,线程之间内存不共享我要你干什么 |
![]() | &bsp; 56 Godikov 2020-04-02 09:49:42 +08:00 病句,去掉“的原因”。 |
![]() | 57 ericguo 2020-04-02 09:50:17 +08:00 ![]() 现在从 PHP 转 Go 不是新闻,从 Go 转 PHP 才是新闻。 |
![]() | 58 tt67wq 2020-04-02 09:52:21 +08:00 ![]() 我司正在从 go 转向 php 从鄙视链的高层走向底层 |
![]() | 59 keepfun 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 keepfun 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 的 cannel 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 ![]() coun 是查询数组的长度或是实现了 Countable 接口的对象的 如果不是这两个会转换成这个实现接口的 如果转换的过程中会相当于装箱成一个数组 null 是个特殊的对象 其他的都会转换成 array(原始值) |
![]() | 67 zjttfs 2020-04-02 10:13:51 +08:00 ![]() 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 ![]() @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 ![]() 我使用 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 ![]() 前期的技术选型很重要,最好有前瞻性的思考。 刚开始起步要求快用 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 ![]() @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 编码 |