Почему вместо нашего пользовательского имени объекта идет stdClass?

Здесь Мое имя класса — Пользователь. Когда я печатаю свойства своего класса, я правильно получаю свое объективное имя. После этого я закодировал данные с помощью 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

Решение

Нет прямого способа получить данные в объекте класса, либо вам нужно использовать собственный метод для декодирования, иначе вы можете использовать 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 см. Вот.

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
)

песочница

Как вы можете видеть вывод {"bar":"bar"} не содержит информации о том, что если бы это был какой-либо класс, это могло бы быть ['bar'=>'bar'] и JSON будет таким же … Тогда при декодировании у вас нет json_decode установить для возврата в виде массива (второй аргумент установлен в true), что хорошо, поскольку это не совсем то, что вам нужно, но когда он установлен таким образом, вы получаете объекты stdClass вместо ассоциативного массива для элементов с нечисловыми ключами. Короче нет способа восстановить класс «foo» из json {"bar":"bar"} поскольку эта информация не существует (вы можете сделать так, чтобы она существовала, но это еще одна сказка для другого дня).

Используя сериализацию, мы получаем что-то совсем другое.

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
)

песочница

это O:3:foo означает Объект с именем класса длиной 3 с именем «foo». Таким образом, он сохраняет эту информацию для использования PHP при «декодировании» данных.

Все это звучит так:

Объект (3) «foo» с 1 свойством по имени (ей) tring (3) «bar» со значением (ями) tring (3) «bar», или что-то в этом роде.

Имеет смысл.

Как примечание, сериализация PHP менее переносима, чем JSON, так как она работает только на PHP, редактировать вручную JSON также намного сложнее, но если вы действительно хотите закодировать класс, это самый простой способ сделать это. Тем не менее, вы также можете «заново заполнить» класс данными JSON, но это также может быть сложно поддерживать.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector