为什么会有stdClass代替我们的自定义对象名称?

时间:2018-12-19 06:48:49

标签: php json

在这里,我的班级名称是User,当我打印班级属性时,我会正确获得目标名称。之后,我使用json_encode()对数据进行了编码。然后我用json_decode()解码。为什么我要 stdClass 目标?

<?php
class User
{
    public $name;
    public $age;
    public $salary;
}
    $user = new User();
    $user->name = 'Siddhu';
    $user->age = 24;
    $user->salary = 7000.80;

print_r($user);
//Output: User Object ( [name] => Siddhu [age] => 24 [salary] => 7000.8 ) 

print_r(json_encode($user));
//Output: {"name":"Siddhu","age":24,"salary":7000.8}

$d = json_encode($user);


$s = json_decode($d);
print_r($s);
//Output: stdClass Object ( [name] => Siddhu [age] => 24 [salary] => 7000.8 ) 

如果您注意到 stdClass 即将到来,如何更改为用户

2 个答案:

答案 0 :(得分:4)

没有直接的方法可以在类对象中获取数据,或者需要使用自定义方法进行解码,否则在解码时可以使用serialize()&& unserialize()函数在类对象中获取数据;

$serialized_user_object = serialize($user);

$deserialized_user_object = unserialize($serialized_user_object);

在json_decode中,如果要将数据作为数组,则可以在第二个参数中传递true。 这样。

var_dump(json_decode($json, true));

要了解有关json_decode的更多信息,请参见here

答案 1 :(得分:3)

发生这种情况的原因可以很容易地证明...

class foo{
    public $bar = 'bar';
}

$json = json_encode(new foo);

echo $json."\n\n";

print_r(json_decode($json));

输出

{"bar":"bar"}

stdClass Object
(
    [bar] => bar
)

Sandbox

您可以看到输出{"bar":"bar"}不包含有关任何类的信息,它可能是['bar'=>'bar'],并且JSON相同...然后解码时,您不必将json_decode设置为以数组形式返回(第二个参数设置为true),这很好,因为这并不是您真正想要的,但是以这种方式设置时,您将获得stdClass对象,而不是用于该对象的关联数组非数字键的项目。简而言之,由于信息不存在(您可以使其存在,但这又是另一回事了),因此无法从json {"bar":"bar"}中恢复类“ foo”。

使用序列化,我们得到了非常不同的东西。

class foo{
    public $bar = 'bar';
}

$json = serialize(new foo);

 echo $json."\n\n";

print_r(unserialize($json));

输出

O:3:"foo":1:{s:3:"bar";s:3:"bar";}

foo Object
(
    [bar] => bar
)

Sandbox

O:3:foo表示对象,其类名为3的长度为3。因此,它可以保留该信息供PHP在“解码”数据时使用。

整个内容如下:

对象(3)“ foo”具有1个名为(s)tring(3)“ bar”的属性,其值为(s)tring(3)“ bar”或类似的东西。

有道理。

请注意,PHP的序列化比JSON移植性差,因为它只能在PHP中使用,因此手动编辑然后比JSON难得多,但是如果您真的想编码一个类,那是最简单的方法。也就是说,您还可以从JSON数据“重新填充”该类,但这也很难维护。