有个关于 PHP 的小疑惑

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

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

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

弱类型,好像能理解,但就是好奇罢了
6196 次点击
所在节点    PHP
73 条回复
kivmi
131 天前
@Felldeadbird 一看就是写代码的人的水平的问题,一般不会出现这种问题,同一个接口还会出现这中问题,应该还是从不同的数据源取数据,有没有处理的问题吧
kivmi
131 天前
@prosgtsr java 是强类型语言,类型不对就报错,不改代码编译不过去啊
kivmi
131 天前
@jiuhuicinv false == 0 和 false == "0" 有毛区别吗? === 才有类型的检测
jiuhuicinv
131 天前
@kivmi 好家伙,我就是那个二杆子货
kivmi
131 天前
@kk2syc echo intval(false).PHP_EOL;
echo intval("0").PHP_EOL;
echo intval(0).PHP_EOL; 要毛三行代码,加个 intval 就行了
kivmi
131 天前
@jiuhuicinv 你是不是我不知道,但是我肯定是,你看哪些说写 php 的都是二杆子货
newtype0092
131 天前
之前做 PHP 后端遇到过,当时是接手前人的项目,前端报类似的 BUG 给我。

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

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

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

上面看起来是一个我被“急功近利”的领导压迫下不得不写 dirty code 的故事。不过我后来简单统计,那个项目上线到我离职为止,同样原因的 BUG 两年多时间内我处理过 4 、5 次,算上同事处理的总共可能十多次,大概耗费的总的工期在 2 到 3 天。所以我也不敢说我的想法真的就比当时的 leader 高明,毕竟眼界和职责都不一样。
(这个问题看起来应该会出现的非常频繁,但实际上很多时候不触碰到一些特殊 case 是不会被发现的,容易发现的地方一般在自测时就会顺手改掉,所以实际被主动上报的情况反而不多。)
Norie
131 天前
有一个 transformer 就不会了,比如 laravel 的
4UyQY0ETgHMs77X8
131 天前
人的问题,反正我基本能用 true 和 false 就 true 和 false 了,除非有些对接三方要求字符串,否则基本不会出现字符串 0
mitoop
131 天前
人的问题 弱类型不是这么弱的 弱类型可能 int 返回 string 但这是一直在变化
lyxxxh2
131 天前
https://learnku.com/laravel/t/87153
跟这个人类似。

弱类型的,只要是用双等号的,大部分 int 和 string 都不分。
在 php 更为突出,因为后端全是数据处理。
QlanQ
131 天前
@kivmi #25 其实现在都用 (int)$a 了
QlanQ
131 天前
人的问题,Java 和其他语言也会有,比如 一个 data 应该返回 [] ;但是如果 一条数据都没有,又会返回 null
cat1879
131 天前
弱类有弱类的方便,所以要接受带来的副作用
darklinden
131 天前
所以对接 Phper 的接口从来不敢上来直接用 json 对象解析器,因为指不定啥时候就会炸
“我服务好好的你那儿怎么挂了?去查吧。”
“你就说我返回的 0 ,‘0’,false , ‘false’ 它是不是非 true 吧”
easychen
131 天前
其实差不多十年前,PHP 就可以不是弱类型了啊。

> PHP 从 PHP 7.0 ( 2015 年 12 月发布)开始,首次引入了标量类型声明( scalar type declarations ),可以对函数参数和返回值进行类型约束。也是从 PHP 7.0 开始,可以开启 严格模式( strict_types )在文件头部加上:

declare(strict_types=1);

这样,PHP 就不会再自动把类型兼容(比如 int 传 string 会出错而不是自动转换)。
seansong
131 天前
@easychen 这样会让 phper 们不会写代码了吧?
easychen
131 天前
@seansong CUrsor 和 Trae 会就行。
kk2syc
131 天前
@kivmi #25 intval 错误的时候返回 1 ,好奇,你在业务线这样写东西?
seansong
131 天前
@easychen 这么说,确实是

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1128194

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX