PHP 里 empty((object)[])是 false 还是 true?

2020-07-08 15:39:57 +08:00
 sagaxu
这么设计是否符合直觉?
4192 次点击
所在节点    PHP
32 条回复
sagaxu
2020-07-09 11:00:52 +08:00
@brader 把 map 都 decode 成 stdClass 也是一种办法,但跟用(object)[]表示{}没什么不同
brader
2020-07-09 11:07:35 +08:00
@sagaxu 你说写法问题的话,我觉得(object)[]没啥不好的,这个语意非常明确,代码可读性也好,但简洁性有待加强,在官方还不支持{}的写法之前,我们只能这么写,你想改变他,可以提议。

你要想想,以前数组,还要写 array()呢,现在变成[],不就是有些致力改变它的人的努力吗
JJstyle
2020-07-09 11:54:10 +08:00
@brader 我需要的是一个对象数组,而加上参数后变成了一个对象:

https://gist.github.com/Jaggle/9338af5321d3294d86d350fd2cad0fc9
JJstyle
2020-07-09 12:08:16 +08:00
@NjcyNzMzNDQ3 我们有一个 json 的配置数据,存在数据库里,首先,解析后他是一个数组,这时进行 json_decode($json, true),没问题,但是他的元素是都是 object,而 object 就应该 decode 成 object

u1s1,我踩 php 了?我又捧了哪个语言?
oooooooooooo
2020-07-09 12:15:04 +08:00
map 和 list 不区分确实很 SB
NjcyNzMzNDQ3
2020-07-09 12:51:51 +08:00
@JJstyle 忘记加断行了,只是句吐槽,没有特别针对某个人
brader
2020-07-09 13:45:53 +08:00
@JJstyle 不理解你的对象数组是什么意思?你写出你所谓的对象数组的 json 串吗?
brader
2020-07-09 13:56:55 +08:00
@JJstyle 还有你前面说的 {}在 json_decode 之后会变成[],
我尝试了一下,并不是这样的

$str = '[{},{}]';
$data = json_decode($str);
var_dump($data);
输出:
array(2) {
[0] =>
class stdClass#153 (0) {
}
[1] =>
class stdClass#154 (0) {
}
}

php 版本 7.2.1
JJstyle
2020-07-09 13:57:38 +08:00
@brader #23 中的第一个 ouput 就是一个对象数组(自身是一个数组,它的每个元素是一个对象)
lovecy
2020-07-09 14:24:49 +08:00
@JJstyle 你的 json_decode,第二个参数是 true 才会把{}解析成 array(),官方文档是这么写的
```当该参数为 TRUE 时,将返回 array 而非 object ```
说白了你自己用的方式不对,在这里抹黑
yc8332
2020-07-09 17:49:48 +08:00
重来没这么写过。。要空对象就用 new stdClass
JJstyle
2020-07-09 18:03:32 +08:00
@lovecy
@brader
@NjcyNzMzNDQ3

我误怪 json_decode 这个函数了,本质上是因为 laravel 在接收参数时,默认用的 json_decode($request, true)解析参数,因此它会把{} decode 成 [],并非抹黑,只是被坑过有点恼火。

解决办法是 1. 针对特定接口使用 json_decode($request, false)解析参数为 object,2. 动态 json 字段使用字符串传输,依然使用 json_decode($request, true)解析参数为 array 。我们选择了第二种方案。

我的锅我的锅我的锅

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

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

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

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

© 2021 V2EX