Функция в моем приложении выполняет следующие действия:
Моя проблема возникает при восстановлении этого блока из базы данных и его расшифровке. Я могу видеть @attributes, когда я var_dump объект, но не могу найти комбинацию команд, которая позволяет мне получить к ним доступ.
Сообщение об ошибке: Fatal error: нельзя использовать объект типа stdClass как массив
Ниже приведен образец моего объекта. Я пробовал, среди прочих, что работал.
echo $obj['class']; stdClass Object ( [@attributes] => stdClass Object ( [class] => race_idx_hdr ) [img] => stdClass Object ( [@attributes] => stdClass Object ( [src] => /Images/Icons/i_blue_bullet.gif [alt] => image [title] => United Kingdom ) ) [a] => Fast Cards )
Когда вы декодируете json из базы данных, вы получаете объект типа 'stdClass' вместо исходного типа SimpleXMLElement, возвращаемого функцией SimpleXMLElement :: xpath.
Объект stdClass не «знает» о синтаксисе псевдосемейства, используемом объектами SimpleXMLElement, чтобы разрешить доступ к атрибутам.
Обычно вы должны использовать функции serialize () и unserialize () вместо json_encode / decode для хранения объектов в базе данных, но, к сожалению, SimpleXMLElements не работают с ними.
В качестве альтернативы, почему бы просто не сохранить фактический xml и не прочитать его обратно в SimpleXML после извлечения из базы данных:
// convert SimpleXMLElement back to plain xml string $xml = $simpleXML->asXML(); // ... code to store $xml in the database // ... code to retrieve $xml from database // recreate SimpleXMLELement $simpleXML = simplexml_load_string($xml);
Я действительно не понимаю, что вы пытаетесь сделать, и где вызывается ошибка, но для доступа к свойствам вашего объекта, который вы можете использовать
echo $obj->{'@attributes'}->class; // prints "race_idx_hdr" echo $obj->img->{'@attributes'}->src; // prints "/Images/Icons/i_blue_bullet.gif" echo $obj->img->{'@attributes'}->alt; // prints "image" echo $obj->img->{'@attributes'}->title; // prints "United Kingdom" echo $obj->a; // prints "Fast Cards"
Этот странный синтаксис ( $obj->{'@attributes'}
) требуется, потому что @
-символ зарезервирован в PHP и не может использоваться для идентификаторов.
Если объект преобразуется в массив, результатом является массив, элементами которого являются свойства объекта.
$asArray = (array)$myObj; echo $asArray['@attribute'];