第一次对接几个 php 写的接口,遇到一个能理解但想好奇八卦一下的细节,对方接口返回 json ,其中有个字段

"is_completed": 0
"is_completed": "0"
"is_completed": false

同一个接口返回的完全一样的同一份数据,为什么每次请求,得到的数据类型都不一样呢,而且是随机的,有时候接口返回的数组中,不同元素里面的这个字段,都会出现不一样的类型,什么场景下会出现这种情况,个别程序员搞成这样的,还是 php 生态中就是这样

弱类型,好像能理解,但就是好奇罢了

有可能这个字段是存 Redis 缓存的,有时候从缓存取,有时候数据库取导致返回值不一样了

PHP 传统,除了 str 和 int 不分,{}和[]也不分,框架随意整,程序员也不在意,前端会兼容,岁月静好

PHP 传统,写接口的那位不在意。。。

false==0 能理解,但是 false=="0"绝对不是 php 的锅

你要告诉 php ,把值固定下来,不然强类型语言无法解析,一会字符串、一会整型,数据类型都变了,只能定义一种数据类型。这样,php 端马上就能改了。我以前也是这样的

这种就是 个别 程序员 的锅了, 啥语言都会有类似的问题的。

应该有判断导致的吧 可能是多个位置处理赋值导致不一样

你规定要什么类型的值,告诉后端必须这样处理。

写接口的 phper 不在意,你和他沟通,强制为 int 就行,php 就加 3 行代码能解决

有可能是从不同地方获取的数据,就不去管对应的是什么类型直接输出了,
有时从数据库获取是正确类型,有时是从 redis 或表单获取默认就是字符串类型,在 PHP 用 if 判断 0 、"0"、false 都得到相同的结果 false ,所以什么类型就不是那么重要,同样前端 js 也表现一样,所以大多数情况下的前后端都没有类型上的问题

if 条件一 return false elseif 条件二 return 0 elseif 条件三 return "0"

很正常 他们自己程序内这些都好处理 对外提供的接口你跟他沟通一下就完事了 不是什么过分要求
因为在他们那边都一样 他不太注意这个 不是问题

false==0 能理解,但是 false=="0"绝对不是 php 的锅

php 程序员便宜知道吧。 便宜他总有便宜的道理。

不应该说,世界上最好的语言,其伟大之处就是能让这些人也入行?

你自己单步执行一步步调试一下

如果是同一个接口类型变化,PHP 没有强制返回类型。业务逻辑上返回了 0 和“0”,语言特性。

如果不是同一个接口,大概率还是写代码的人水平太低了。没有统一的数据处理。加上语言特性导致返回类型可变

多条逻辑判断结果值类型随意定义罢了,PHP 在国内的名声就是让这帮“二杆子货”霍霍了

那倒不会说无法处理,在反序列化的时候注意一下就行,只是,心里特别没底,因为不知道有多少是测试阶段没遇到的,可能就漏处理了,我也就是临时帮别人写个小东西,看到这种情况,好奇了一下而已

我在对接某个支付的时候遇到过这个问题,搞得我这边解析 json 报错了,去反馈之后告诉我在某个场景下会出现……
我又一次理解到了为啥企业项目喜欢用 java 开发

感谢 php ,让我一个高中的也能入行

一看就是写代码的人的水平的问题,一般不会出现这种问题,同一个接口还会出现这中问题,应该还是从不同的数据源取数据,有没有处理的问题吧

java 是强类型语言,类型不对就报错,不改代码编译不过去啊

false == 0 和 false == "0" 有毛区别吗? === 才有类型的检测

好家伙,我就是那个二杆子货

echo intval(false).PHP_EOL;
echo intval("0").PHP_EOL;
echo intval(0).PHP_EOL; 要毛三行代码,加个 intval 就行了

你是不是我不知道,但是我肯定是,你看哪些说写 php 的都是二杆子货

之前做 PHP 后端遇到过,当时是接手前人的项目,前端报类似的 BUG 给我。

我以为是个很简单的问题,就开始追查,结果发现像在扯毛线头。。。
从收到请求开始,网关、业务层、框架、三方库、数据库、缓存、内部微服务。。。所有地方都可能出问题。
各处代码的维护者对这些值的校验逻辑不一致,业务逻辑的差异又导致不确定会经过哪些处理链路。

最后 leader 问我多久能解决这个问题,我说需要添加一个中间件来统一 ResponseBody 的 json 映射逻辑,估计要一个月,将中间件应用到所有 PHP 服务,测试所有受影响的接口,再做相应的适配,需要估计两到三个月,前端受影响的地方需要同步更新,需要他们评估时间。

最后采用的方案是在前端报 BUG 的那个接口返回时对指定两个 key 做一次 cast ,工期 1 小时。

上面看起来是一个我被“急功近利”的领导压迫下不得不写 dirty code 的故事。不过我后来简单统计,那个项目上线到我离职为止,同样原因的 BUG 两年多时间内我处理过 4 、5 次,算上同事处理的总共可能十多次,大概耗费的总的工期在 2 到 3 天。所以我也不敢说我的想法真的就比当时的 leader 高明,毕竟眼界和职责都不一样。
(这个问题看起来应该会出现的非常频繁,但实际上很多时候不触碰到一些特殊 case 是不会被发现的,容易发现的地方一般在自测时就会顺手改掉,所以实际被主动上报的情况反而不多。)

有一个 transformer 就不会了,比如 laravel 的