为什么当我将 json_decode()(在非关联模式下)转换为对象时"scalar"显示为这样?



在进行一些代码重构时,我暂时陷入了我基本上在做(有点抽象的(等价

物的情况
$data = (object)json_decode('"test"');

当然,我理解json_decode()会自行生成对象,除非assoc是错误的。(顺便说一下,我遇到了这种情况,因为我正在移动一些格式处理代码,而且我还没有意识到我的一个(object)转换现在是多余的。

但。。。当这种情况发生时,PHP 决定$data包含:

stdClass Object
(
[scalar] => test
)

寺院。

scalar?!

最后我才知道,"test"是一根绳子,所以这里似乎不止一堆东西掉了下来。还是这种不直观但有意的设计?!

我当然已经删除了(object),事情完全按照我现在的意图进行。所以这里本身没有错误。我只是想了解刚刚发生了什么。

在这里,如果您想加入令人头疼的行列:

php -r 'print_r((object)json_decode(""test""));'

我使用的是 7.0.25。

这正是手册指定将标量类型(即整数、字符串、浮点数、布尔值(转换为对象时将发生的情况。

如果将对象转换为对象,则不会对其进行修改。如果将任何其他类型的值转换为对象,则会创建 stdClass 内置类的新实例。如果值为 NULL,则新实例将为空。数组转换为具有由键和相应值命名的属性的对象。请注意,在这种情况下,在 PHP 7.2.0 之前,除非迭代,否则无法访问数字键。

对于任何其他值,名为标量的成员变量将包含该值。

$obj = (object) 'ciao';
echo $obj->scalar;  // outputs 'ciao'

最新更新