
1 vem 215 天前 有可能这个字段是存 Redis 缓存的,有时候从缓存取,有时候数据库取导致返回值不一样了 |
2 sagaxu 215 天前 PHP 传统,除了 str 和 int 不分,{}和[]也不分,框架随意整,程序员也不在意,前端会兼容,岁月静好 |
3 ferock PRO PHP 传统,写接口的那位不在意。。。 |
4 uqf0663 215 天前 false==0 能理解,但是 false=="0"绝对不是 php 的锅 |
5 abccccabc 215 天前 你要告诉 php ,把值固定下来,不然强类型语言无法解析,一会字符串、一会整型,数据类型都变了,只能定义一种数据类型。这样,php 端马上就能改了。我以前也是这样的 |
6 akira 215 天前 这种就是 个别 程序员 的锅了, 啥语言都会有类似的问题的。 |
7 zhhqiang 215 天前 via Android 应该有判断导致的吧 可能是多个位置处理赋值导致不一样 |
8 glitter1105 215 天前 你规定要什么类型的值,告诉后端必须这样处理。 |
9 v1 215 天前 写接口的 phper 不在意,你和他沟通,强制为 int 就行,php 就加 3 行代码能解决 |
10 caola 215 天前 有可能是从不同地方获取的数据,就不去管对应的是什么类型直接输出了, 有时从数据库获取是正确类型,有时是从 redis 或表单获取默认就是字符串类型,在 PHP 用 if 判断 0 、"0"、false 都得到相同的结果 false ,所以什么类型就不是那么重要,同样前端 js 也表现一样,所以大多数情况下的前后端都没有类型上的问题 |
11 realpg PRO if 条件一 return false elseif 条件二 return 0 elseif 条件三 return "0" 很正常 他们自己程序内这些都好处理 对外提供的接口你跟他沟通一下就完事了 不是什么过分要求 因为在他们那边都一样 他不太注意这个 不是问题 |
12 jiuhuicinv 215 天前 false==0 能理解,但是 false=="0"绝对不是 php 的锅 |
13 hefish 215 天前 php 程序员便宜知道吧。 便宜他总有便宜的道理。 |
14 wakarimasen 215 天前 不应该说,世界上最好的语言,其伟大之处就是能让这些人也入行? |
15 z7356995 215 天前 你自己单步执行一步步调试一下 |
16 Felldeadbird 215 天前 如果是同一个接口类型变化,PHP 没有强制返回类型。业务逻辑上返回了 0 和“0”,语言特性。 如果不是同一个接口,大概率还是写代码的人水平太低了。没有统一的数据处理。加上语言特性导致返回类型可变 |
17 wenber 215 天前 多条逻辑判断结果值类型随意定义罢了,PHP 在国内的名声就是让这帮“二杆子货”霍霍了 |
18 seansong OP @abccccabc 那倒不会说无法处理,在反序列化的时候注意一下就行,只是,心里特别没底,因为不知道有多少是测试阶段没遇到的,可能就漏处理了,我也就是临时帮别人写个小东西,看到这种情况,好奇了一下而已 |
19 prosgtsr 215 天前 via iPhone 我在对接某个支付的时候遇到过这个问题,搞得我这边解析 json 报错了,去反馈之后告诉我在某个场景下会出现…… 我又一次理解到了为啥企业项目喜欢用 java 开发 |
20 kivmi 215 天前 感谢 php ,让我一个高中的也能入行 |
21 kivmi 215 天前 @Felldeadbird 一看就是写代码的人的水平的问题,一般不会出现这种问题,同一个接口还会出现这中问题,应该还是从不同的数据源取数据,有没有处理的问题吧 |
23 kivmi 215 天前 @jiuhuicinv false == 0 和 false == "0" 有毛区别吗? === 才有类型的检测 |
24 jiuhuicinv 215 天前 @kivmi 好家伙,我就是那个二杆子货 |
25 kivmi 215 天前 @kk2syc echo intval(false).PHP_EOL; echo intval("0").PHP_EOL; echo intval(0).PHP_EOL; 要毛三行代码,加个 intval 就行了 |
26 kivmi 215 天前 @jiuhuicinv 你是不是我不知道,但是我肯定是,你看哪些说写 php 的都是二杆子货 |
27 newtype0092 215 天前 之前做 PHP 后端遇到过,当时是接手前人的项目,前端报类似的 BUG 给我。 我以为是个很简单的问题,就开始追查,结果发现像在扯毛线头。。。 从收到请求开始,网关、业务层、框架、三方库、数据库、缓存、内部微服务。。。所有地方都可能出问题。 各处代码的维护者对这些值的校验逻辑不一致,业务逻辑的差异又导致不确定会经过哪些处理链路。 最后 leader 问我多久能解决这个问题,我说需要添加一个中间件来统一 ResponseBody 的 json 映射逻辑,估计要一个月,将中间件应用到所有 PHP 服务,测试所有受影响的接口,再做相应的适配,需要估计两到三个月,前端受影响的地方需要同步更新,需要他们评估时间。 最后采用的方案是在前端报 BUG 的那个接口返回时对指定两个 key 做一次 cast ,工期 1 小时。 上面看起来是一个我被“急功近利”的领导压迫下不得不写 dirty code 的故事。不过我后来简单统计,那个项目上线到我离职为止,同样原因的 BUG 两年多时间内我处理过 4 、5 次,算上同事处理的总共可能十多次,大概耗费的总的工期在 2 到 3 天。所以我也不敢说我的想法真的就比当时的 leader 高明,毕竟眼界和职责都不一样。 (这个问题看起来应该会出现的非常频繁,但实际上很多时候不触碰到一些特殊 case 是不会被发现的,容易发现的地方一般在自测时就会顺手改掉,所以实际被主动上报的情况反而不多。) |
28 Norie 215 天前 via Android 有一个 transformer 就不会了,比如 laravel 的 |
29 4UyQY0ETgHMs77X8 214 天前 人的问题,反正我基本能用 true 和 false 就 true 和 false 了,除非有些对接三方要求字符串,否则基本不会出现字符串 0 |
30 mitoop 214 天前 人的问题 弱类型不是这么弱的 弱类型可能 int 返回 string 但这是一直在变化 |
31 lyxxxh2 214 天前 |
33 QlanQ 214 天前 人的问题,Java 和其他语言也会有,比如 一个 data 应该返回 [] ;但是如果 一条数据都没有,又会返回 null |
34 cat1879 214 天前 弱类有弱类的方便,所以要接受带来的副作用 |
35 darklinden 214 天前 |
36 easychen 214 天前 其实差不多十年前,PHP 就可以不是弱类型了啊。 > PHP 从 PHP 7.0 ( 2015 年 12 月发布)开始,首次引入了标量类型声明( scalar type declarations ),可以对函数参数和返回值进行类型约束。也是从 PHP 7.0 开始,可以开启 严格模式( strict_types )在文件头部加上: declare(strict_types=1); 这样,PHP 就不会再自动把类型兼容(比如 int 传 string 会出错而不是自动转换)。 |
41 AV1 214 天前 @uqf0663 @jiuhuicinv php 里写 [false == 0] 跟 [false == "0"] 还真没区别 参考 php ==真值表: https://imgur.com/a/sDmywKN ![]() 出处 https://github.com/sentientmachine/php_equality_charts |
43 kivmi 214 天前 @kk2syc 直接用,有什么问题?提前暴露问题不是更好?你非要把你的代码,搞的什么觉得有多么健壮?等到了生产,出问题了然后查日志去?实际开发,也很难遇到过你这么复杂的场景,本身就是用来处理基本类型的,你非要整个对象,违背了它设计的初衷。 |
47 dabingbing 214 天前 PHP 写多了,不习惯强类型,但是实际上写 PHP 代码的时候,会有意的强制类型,比如 intval 之类的 |
48 seansong OP @kivmi “你这一加,php 不就更慢了?” 按理说,严格类型,应该是变快吧,怎么会更慢呢?当然,我不了解 php 的内存管理,这么说不一定对哈,不用做隐式转换,应该是节约了资源才对 |
50 kivmi 214 天前 @seansong 好问题!的确没有隐式转换肯定会快,但是 php 所有的类型都是使用 ZVAL 一个结构体来存储的,php 是做不到真正的强类型的,这是 PHP 的设计问题! declare(strict_types=1)并不影响 php 的类型设计,只是约束了函数参数和返回值的类型而已!并没有对 php 的类型有实质性的改变! |
51 0IuL7w7X5K2HJxZf 214 天前 @newtype0092 你真搞了中间件统一了的话,很可能会在你有很多意想不到的地方报 bug 一堆出来。 |
53 siweipancc 214 天前 via iPhone 0 ,空字符串,空数组,-1 都属于 false ,就问你怕不怕 |
54 sycxyc 214 天前 @siweipancc -1 不属于 false 吧。其它例子也适用于 js |
58 NowTime 214 天前 via Android 负责维护的一个 Laravel 项目,4 年前还是 PHP 7.1, Laravel 5.8 ,现在已经升级到了 PHP 8.4 、Laravel 12 了,学过 Java 所以对 PHP 类型声明一点都不突兀反而觉得很好用,并且能用对象的都用对象不使用 array ,基本很难出现什么 API 字段类型不对、弱判断等问题,代码也写的很舒服。 |
59 michealzh 213 天前 这个不是 php 的问题... |
60 gloeaerris 213 天前 这个是个人问题,不是 PHP 的问题,门槛太低就会有很多菜鸡 |
61 GuangXiN 213 天前 JS 也是 false == '0' 我这儿已经强制用 === 了 |
62 sthwrong 213 天前 这个和 php 无关,我对接的 java 喜欢用 map ,返回值类型也不固定。 |
63 jhdxr 213 天前 |
64 yc8332 213 天前 接口没有做统一的数据处理。。直接返回是数字 int ,然后 int 存到数据库,取出来就变成 string 了,然后可能取的时候他没值就把数据库的返回值给返回了,就是 false 。。。 正常会做个数值强制转换,看是返回字符串或者是数字。。统一接口的返回值 |
66 LieNoWell 212 天前 单纯是程序员的问题。 Java 也见过同一个接口,返回一条数据时是对象,多条数据时是列表的情况。 |
67 yc8332 @seansong 基本上常见的编程语言的 mysql 驱动都是默认字符串返回的,保证精度不会丢失,然后程序里再自己转换,驱动那边也有参数可以设置不默认返回字符串类型。 |
73 soul11201 184 天前 混乱有序 |