有个关于 PHP 的小疑惑

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

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

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

弱类型,好像能理解,但就是好奇罢了
6353 次点击
所在节点    PHP
73 条回复
GuangXiN
142 天前
JS 也是 false == '0'
我这儿已经强制用 === 了
sthwrong
142 天前
这个和 php 无关,我对接的 java 喜欢用 map ,返回值类型也不固定。
jhdxr
141 天前
@seansong #52
@kivmi #50
你错了,严格类型在执行的时候是会带来性能提升的。PHP 的很多 opcode 都对于不同类型有不同的处理,如果在编译时(这个编译不是编译型语言的编译,而只是从 php 代码转化为 php 自己的中间代码——以前是直接转 OPCODE ,后来是转 AST )的时候无法确定就会落入一个兜底的逻辑。能够提前确定类型可以规避掉这部分并不小的开销。
但需要说明的是,这个判断并不是类型提示(这只是一种可以用来帮助推断的信息),还包括了别的推断手段。
yc8332
141 天前
接口没有做统一的数据处理。。直接返回是数字 int ,然后 int 存到数据库,取出来就变成 string 了,然后可能取的时候他没值就把数据库的返回值给返回了,就是 false 。。。
正常会做个数值强制转换,看是返回字符串或者是数字。。统一接口的返回值
seansong
141 天前
@yc8332 int 存进数据库,取出来为什么会是 string ?这个有点奇怪
MrSheng
141 天前
单纯是程序员的问题。
Java 也见过同一个接口,返回一条数据时是对象,多条数据时是列表的情况。
yc8332
141 天前
@seansong 基本上常见的编程语言的 mysql 驱动都是默认字符串返回的,保证精度不会丢失,然后程序里再自己转换,驱动那边也有参数可以设置不默认返回字符串类型。
seansong
141 天前
@yc8332 你说的是 int 吗?
yc8332
141 天前
@seansong 就是数据库里的字段查询返回不管你是什么类型,传输过程默认是字符串。
seansong
141 天前
@yc8332 不应该是字节流么,怎么会是字符串呢,哥们你这大误解了,pg/mysql 这两个最常见的,协议传输的都是字节流
yc8332
141 天前
@seansong 我说的内容,内容。。你可以去了解一下,传输哪个协议底层不是字节流?
seansong
141 天前
@yc8332 可能 php 的客户端库会在过去到字节之后把内容先解码成字符串吧,肯定不会是常见行为的,毕竟这个行为在强类型需要里面直接就是错误
soul11201
112 天前
混乱有序

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

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

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

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

© 2021 V2EX