V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wangbenjun5
V2EX  ›  程序员

这就是我为什么从 PHP 转向 Go 的原因

  •  
  •   wangbenjun5 · 2020-04-01 22:22:32 +08:00 · 16592 次点击
    这是一个创建于 1729 天前的主题,其中的信息可能已经有所发展或是发生改变。

    记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 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 条附言  ·  2020-04-02 12:39:31 +08:00
    只是一小方面,如果换个时髦的说法,那就是写 go 的心智负担要小很多,php 虽然灵活,但不确定性太多。
    第 2 条附言  ·  2020-04-02 12:49:20 +08:00
    不是说弱类型就一定有问题,PHP 的很多问题不是弱类型导致的,而且设计之初就留下的坑,比如毫无规律的函数命名方式、无章可循的参数顺序,你找不到边界。。。现在最新的 php7+已经在类型上面做文章了,这是个好事
    155 条回复    2020-04-09 16:17:05 +08:00
    1  2  
    yafoo
        1
    yafoo  
       2020-04-01 22:31:38 +08:00 via Android   ❤️ 1
    各有优缺点吧,有些人喜欢自由,有些人喜欢被束缚。
    salamanderMH
        2
    salamanderMH  
       2020-04-01 22:35:51 +08:00 via Android   ❤️ 1
    把 PHP 的手册背下来的也。。。面试挺随机的,我觉得这种问题。。
    fox0001
        3
    fox0001  
       2020-04-01 22:36:17 +08:00 via Android   ❤️ 1
    PHP 内置函数名称最为要命,无章可循…
    puzzle9
        4
    puzzle9  
       2020-04-01 22:39:49 +08:00
    这种事情是吧
    如果站在圈外 自然看的明白
    如果站在圈内 也不觉得迷糊
    iConnect
        5
    iConnect  
       2020-04-01 22:45:33 +08:00 via Android
    弱类型项目大了之后,确实缺乏一种安全感。
    0DBBFF
        6
    0DBBFF  
       2020-04-01 22:47:37 +08:00   ❤️ 5
    "写 PHP 的时间越久你就会发现 PHP 的弱类型带来的好处远远大于坏处"
    aloxaf
        7
    aloxaf  
       2020-04-01 22:50:35 +08:00   ❤️ 1
    我也觉得弱类型毫无意义(注:弱类型!=动态类型),不只是维护的问题,还有安全性的问题
    不过这个面试题……


    P.S. php 7 其实也有 strict mode 了
    PP.S. 我感觉 LZ 很适合学 Rust (笑
    Felldeadbird
        8
    Felldeadbird  
       2020-04-01 22:50:43 +08:00
    好处远远大于坏处,项目写到最后几乎无法维护

    既然好处大于坏处,项目怎么最后无法维护呢?奇怪的 BUG ?前端传递 1. 结果 PHP 接收到的 其他值?

    感觉楼主没突出转 GO 的重要性啊。
    masker
        9
    masker  
       2020-04-01 22:52:26 +08:00 via Android   ❤️ 2
    你就是为了转而转,说的那么冠冕堂皇
    dcsite
        10
    dcsite  
       2020-04-01 22:54:00 +08:00   ❤️ 19
    PHP 是无辜的,弱类型语言

    可恨的是出这种面试题的人,建议你反问他:你知道茴香豆的茴字有几种写法吗?
    crella
        11
    crella  
       2020-04-01 22:56:46 +08:00
    python 和 ruby 不都是动态强类型吗?

    type('text') => class 'str'

    'text'.class => String
    Numbcoder
        12
    Numbcoder  
       2020-04-01 22:57:12 +08:00   ❤️ 1
    不写测试,神仙语言也救不了你
    wangyzj
        13
    wangyzj  
       2020-04-01 22:59:26 +08:00
    学到了
    stabc
        14
    stabc  
       2020-04-01 23:00:31 +08:00   ❤️ 1
    我写 PHP 好多年了,从来没遇到过那种问题。PHP 坑是很多,但是很多你几乎踩不到。新版本的 PHP 也支持 function 的类型定义了。
    hantsy
        15
    hantsy  
       2020-04-01 23:00:51 +08:00   ❤️ 1
    这也能和语言的优劣扯上关系,你应该 PHP 和 Go 都从来没写过测试吧。
    cmdOptionKana
        16
    cmdOptionKana  
       2020-04-01 23:01:21 +08:00
    静态语言一大堆,为什么选择 Go ?
    outoftimeerror
        17
    outoftimeerror  
       2020-04-01 23:03:28 +08:00
    写完只要编译没报错,基本上都没问题。
    如果是这个特性的话,我觉得 rust 更符合你的期待。
    back0893
        18
    back0893  
       2020-04-01 23:03:50 +08:00   ❤️ 1
    我觉得你这面试题不是就是茴有几种写法...
    hantsy
        19
    hantsy  
       2020-04-01 23:04:02 +08:00
    PHP 好像 5.6 开始在 OOP 方面就基本和 Java,C#可以站在一条起跑线上,弱类型自己要用,那只说是自己的问题。
    hantsy
        20
    hantsy  
       2020-04-01 23:05:31 +08:00
    大千世界无奇不有,V 站真是一个娱乐网站。
    mcfog
        21
    mcfog  
       2020-04-01 23:20:40 +08:00 via Android   ❤️ 2
    心情极度复杂。要是多年前,我会庆幸又有个半桶水离开 php 圈子了,可是现在写 go 的机会也多了,团队也多了,这样的半桶水在 php 团队里写的代码气味特征明显一眼就能找到,可是混迹在 golang 团队里,好像还真挺难发现的,等发现的时候,可能已经对代码库造成难以承受的破坏了
    blless
        22
    blless  
       2020-04-01 23:29:26 +08:00
    我也觉得是这样,Rust 也想学,但是上手难度太高了。
    Dart
        23
    Dart  
       2020-04-01 23:32:14 +08:00
    面试人傻 B,你嘛。。。
    also24
        24
    also24  
       2020-04-01 23:45:53 +08:00   ❤️ 1
    莫名其妙的想起了这个:

    https://i.loli.net/2020/04/01/Ce74FGnOioMbf5a.png
    mamahaha
        25
    mamahaha  
       2020-04-02 00:01:58 +08:00
    不想用就没必要再踩一脚了。就像分手的情侣,好聚好散,藕断丝连会让彼此都痛苦。
    ferock
        26
    ferock  
       2020-04-02 00:07:09 +08:00 via Android   ❤️ 4
    但是用 GO,写完只要编译没报错,基本上都没问题。


    看来你写的 go 也不咋地
    ericgui
        27
    ericgui  
       2020-04-02 00:08:37 +08:00   ❤️ 1
    面试官是个神经病
    sagaxu
        28
    sagaxu  
       2020-04-02 00:10:20 +08:00 via Android
    天呐,7 个 count,我一个都答不上来,我只会 count 数组
    Varobjs
        29
    Varobjs  
       2020-04-02 00:10:59 +08:00 via Android
    这么说, 也可以转 Java 啊
    tourist2018
        30
    tourist2018  
       2020-04-02 00:14:45 +08:00
    碰见面试问这种问题的 我会直接怼回去
    nvhanzhi
        31
    nvhanzhi  
       2020-04-02 00:14:52 +08:00
    面试不爽直接怼回去就行了,反正以后再也难见面!
    yunye
        32
    yunye  
       2020-04-02 00:49:35 +08:00 via Android
    现在转个语言也要全网声明了?
    JJstyle
        33
    JJstyle  
       2020-04-02 01:07:48 +08:00 via iPhone   ❤️ 1
    最讨厌这种面试题,这种 count 有啥意思
    zhuzhibin
        34
    zhuzhibin  
       2020-04-02 01:33:51 +08:00
    我知道了 你因为无非强类型 所以转了 go,那为什么不转 java 还有其他??
    lithbitren
        35
    lithbitren  
       2020-04-02 02:05:09 +08:00
    目前最满足主楼最后一句话的只有 rust,其他语言都达不到 rust 的程度,rust 虽然也不完全保证,不过应该是知名语言里最能令人跳脚的。
    halo117
        36
    halo117  
       2020-04-02 03:59:39 +08:00 via iPhone
    转语言以后,不信不会有新坑,提升编码姿势水平才是关键,大道至简语言也有一些茴字有几种写法的面试问题
    love
        37
    love  
       2020-04-02 06:42:17 +08:00 via Android
    这种面试官怕是脑子有坑,你也可以反问它另外一个函数给它异常输入结果是啥
    ben1024
        38
    ben1024  
       2020-04-02 08:31:34 +08:00
    面试题挺糟糕,换个语言的理由也挺糟糕
    phpcxy
        39
    phpcxy  
       2020-04-02 08:49:00 +08:00
    不用写测试的?
    LokiSharp
        40
    LokiSharp  
       2020-04-02 09:00:32 +08:00
    你用了 Go 之后会发现,其实 Go 也不咋地
    php01
        41
    php01  
       2020-04-02 09:02:45 +08:00   ❤️ 5
    基本上可以认定为人的问题。
    php 写的好的,写 go 也不会有问题。
    php 写的不好的,写 go 也会有问题。
    反之亦然。
    AngryMagikarp
        42
    AngryMagikarp  
       2020-04-02 09:03:02 +08:00
    这种情况在 Python 上也有。

    因为一个大型项目参与的人一定很多,而人员之间水平参差不齐,弱类型确实更容易导致混乱。注意这个“更”字,这是相对的。

    PHP 是世上最好的语言。
    yvescheung
        43
    yvescheung  
       2020-04-02 09:05:44 +08:00
    这真的是为了面试而面试了,我知道茴香豆有几种写法但是我也成不了鲁迅
    2379920898
        44
    2379920898  
       2020-04-02 09:07:37 +08:00
    你不如转个客户端,后端语音只是一种工具,学到不同的思路才能恒久远
    skys215
        45
    skys215  
       2020-04-02 09:12:14 +08:00   ❤️ 1
    > "就一下子被问到了,只怪自己基础不扎实,没把 PHP 的手册背下来"

    换了 go,基础就扎实了吗,就不用背手册也能通过面试了吗
    dongisking
        46
    dongisking  
       2020-04-02 09:21:57 +08:00
    1,1,1,1,0,报错(没答对)。我看了一下好像也没多难啊
    qq1340691923
        47
    qq1340691923  
       2020-04-02 09:23:52 +08:00
    不建议转 go 真的。。
    qsnow6
        48
    qsnow6  
       2020-04-02 09:24:29 +08:00
    不写测试的锅,不要怪弱类型语言
    everhythm
        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; ?

    是个正常人,根本不会这么写代码,我有健壮的符合工程的代码写法,为什么要研究这种刁钻且无用的写法?
    qq1340691923
        50
    qq1340691923  
       2020-04-02 09:29:07 +08:00
    go 也就比 php 好一点,不如搞 java
    KasonPasser
        51
    KasonPasser  
       2020-04-02 09:30:38 +08:00   ❤️ 2
    新的 PHP 版本中只能 count 数组。
    zjsxwc
        52
    zjsxwc  
       2020-04-02 09:31:38 +08:00
    go 就是没有泛型不爽,什么时候有泛型就完爆别的 GC 语言了
    jin7
        53
    jin7  
       2020-04-02 09:32:36 +08:00
    不推荐 go 语言
    sagaxu
        54
    sagaxu  
       2020-04-02 09:40:32 +08:00 via Android
    @zjsxwc 完爆不了,go 的 gc 目前稍有劣势
    Still4
        55
    Still4  
       2020-04-02 09:47:15 +08:00
    说下我转 go 的原因,php 的多线程太弱了,线程之间内存不共享我要你干什么
    Godikov
        56
    Godikov  
       2020-04-02 09:49:42 +08:00
    病句,去掉“的原因”。
    ericguo
        57
    ericguo  
       2020-04-02 09:50:17 +08:00   ❤️ 1
    现在从 PHP 转 Go 不是新闻,从 Go 转 PHP 才是新闻。
    tt67wq
        58
    tt67wq  
       2020-04-02 09:52:21 +08:00   ❤️ 2
    我司正在从 go 转向 php
    从鄙视链的高层走向底层
    fenglangjuxu
        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 是世界最好的语言~
    fenglangjuxu
        60
    fenglangjuxu  
       2020-04-02 10:03:26 +08:00
    但是是有结果的 如果屏蔽报错
    qq1340691923
        61
    qq1340691923  
       2020-04-02 10:03:36 +08:00
    @tt67wq 什么原因
    jswh
        62
    jswh  
       2020-04-02 10:04:17 +08:00
    所以你怎么不选 Rust ?那个才是编译不报错,连 bug 都几乎没有啊。
    说到底,还是钱。如果 PHP 给钱多工作好找,还会转 go 么?
    zjsxwc
        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 在业务搬砖领域还是不推荐,挺适合写基础设施的。
    tt67wq
        64
    tt67wq  
       2020-04-02 10:12:05 +08:00
    @qq1340691923 #61 接了百度的二手外包,已经是用 php 写的烂尾项目了,烂尾+ php, 我简直要原地升天
    keepeye
        65
    keepeye  
       2020-04-02 10:12:54 +08:00
    面试官估计也就不超过 3 年经验吧,会问这种问题不奇怪
    jy28520
        66
    jy28520  
       2020-04-02 10:13:41 +08:00   ❤️ 1
    coun 是查询数组的长度或是实现了 Countable 接口的对象的
    如果不是这两个会转换成这个实现接口的
    如果转换的过程中会相当于装箱成一个数组 null 是个特殊的对象
    其他的都会转换成 array(原始值)
    zjttfs
        67
    zjttfs  
       2020-04-02 10:13:51 +08:00   ❤️ 1
    php , go ,py ,rust 依然主力 PHP...
    dapang1221
        68
    dapang1221  
       2020-04-02 10:17:14 +08:00
    业务代码里你去 count 一个 undefinedVariable 就离谱,这破题还不如手写反转红黑树
    Tomorrowxxy
        69
    Tomorrowxxy  
       2020-04-02 10:17:30 +08:00
    @fenglangjuxu #59 7.2 以后就只能 count 数组或对象了
    way2create
        70
    way2create  
       2020-04-02 10:20:14 +08:00
    觉得面试问这种问题很弱智
    chizuo
        71
    chizuo  
       2020-04-02 10:21:40 +08:00
    @crella python 那个叫 tyoe hint,咋就变成强类型了?
    also24
        72
    also24  
       2020-04-02 10:21:49 +08:00 via Android
    @Godikov 哈哈哈哈我就想看谁先说这个
    bravist
        73
    bravist  
       2020-04-02 10:26:18 +08:00
    动态类型与静态类型语言有一定的区别,主要看应用场景,解决问题的复杂度,时间成本等等

    用了多年的 PHP 开发,必须要掌握一门动态语言,对比之后你才发现各自的优劣(这是从语言设计的本身角度讲)
    davidyanxw
        74
    davidyanxw  
       2020-04-02 10:26:43 +08:00
    1.面试题目技术含量不高,照实说我觉得不算错
    2.弱类型语言都有类似的问题,再加上不习惯写单元测试。
    大项目就不太可控,如果单元测试覆盖的全,很大程度上会改善项目质量
    MengiNo
        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 )
    qce7
        76
    qce7  
       2020-04-02 10:46:26 +08:00
    count() 一个字符串我在支付宝的 PHP SDK 代码中见过,这种神仙用法不想吐槽了
    killerv
        77
    killerv  
       2020-04-02 11:16:30 +08:00   ❤️ 1
    我使用 PHP 和 Go,但是我感觉这个题目没什么意义,我想不到 count 非 Countable 的使用场景,当然你可以说返回值不一定是预期类型,但是 PHP7.2 之后 count 字符串之类的会报错。
    PHP 的优点也是缺点,很多人都是初识 PHP 的时候会觉得这玩意上手真快,后期维护的时候发现了这种快带来的问题,然后又开始抨击。还是应该客观看待吧,PHP 有他的使用场景,而且项目的健壮性和使用者水平有很大关系。
    whoami9894
        78
    whoami9894  
       2020-04-02 11:49:52 +08:00
    直接怼回去啊,对面试官说:问这种问题,你的水平可想而知
    crella
        79
    crella  
       2020-04-02 11:56:24 +08:00 via Android
    @chizuo 我是看 https://blog.csdn.net/sgs595595/article/details/83986580 里的编程语言分类图的。
    CSM
        80
    CSM  
       2020-04-02 12:01:33 +08:00 via Android
    吐槽一下标题。

    从 PHP 转向 Go 的原因 -> PHP 是弱类型

    为什么从 PHP 转向 Go 的原因 -> 为什么(从 PHP 转向 Go 的原因) -> 为什么 PHP 是弱类型

    可见“为什么……的原因”是个二级的原因。
    crella
        81
    crella  
       2020-04-02 12:07:32 +08:00 via Android
    @bravist 之前专门比较过过 php5 与 js py3 ruby golang c#的闭包,刚才又看了看 php7.4 的闭包。发现 php 设计的水平真的是低于平均线……
    SummerWQM
        82
    SummerWQM  
       2020-04-02 12:23:13 +08:00
    7 的版本 已经强制要求传入 数组类型了
    wangbenjun5
        83
    wangbenjun5  
    OP
       2020-04-02 12:34:09 +08:00
    @0DBBFF
    @Felldeadbird 手误,打错了
    wangbenjun5
        84
    wangbenjun5  
    OP
       2020-04-02 12:36:16 +08:00
    @hantsy
    @phpcxy
    @qsnow6

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

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

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

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

    我们这边的发展路线就是 PHP -> JAVA 、PHP (当时用的 Thrift ) -> Java -> 未来可能会引入 ServiceMesh 概念来拥抱多语言开发生态
    sunznx
        92
    sunznx  
       2020-04-02 13:07:35 +08:00
    我想转 go 是因为 php 找不到工作
    sunznx
        93
    sunznx  
       2020-04-02 13:09:36 +08:00
    另外,如果面试官问我这个问题,我会觉得他是傻逼,给我 50k 我就会和他一起干活
    areless
        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
    laravel
        95
    laravel  
       2020-04-02 13:26:45 +08:00
    做什么项目,用什么语言,没有说什么项目和要求,讨论语言没意义吧。
    winterfell30
        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 才行,求问一下这个真的没办法解决吗
    niucility
        97
    niucility  
       2020-04-02 13:42:46 +08:00
    @Tomorrowxxy 补充一下: 对象需要实现 Countable
    encro
        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]⏎
    lepig
        99
    lepig  
       2020-04-02 13:48:39 +08:00
    深有同感 不过目前靠 PHP 吃饭 就这样吧
    crystom
        100
    crystom  
       2020-04-02 13:50:18 +08:00
    @winterfell30 空的时候让 php 转成 (object)[] 再进行 json 编码
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1276 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 17:53 · PVG 01:53 · LAX 09:53 · JFK 12:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.