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