Изучаем форматы данных в PHP: JSON, XML и механизм serialize
Основные форматы данных в PHP
Разработчику на PHP часто приходится работать с обменом данными между приложениями или сохранять сложные структуры. Для этого язык предлагает несколько встроенных форматов: JSON, XML и собственный механизм сериализации. Каждый из них имеет свою область применения и особенности.
JSON – универсальный формат для веба
JSON (JavaScript Object Notation) стал де‑факто стандартом для передачи данных в современных веб‑приложениях. PHP предоставляет две простые функции: json_encode() и json_decode(). Преобразование массива или объекта в строку JSON выполняется легко. Для корректной работы с кириллицей и отступами применяют опции: JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT. Пример:
$data = ['name' => 'Анна', 'age' => 30];
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);Php форматы данных (форматы данных в php (json, xml, serialize))
Обратное преобразование:
$decoded = json_decode($json, true); // true возвращает массив
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка: ' . json_last_error_msg();
}Php null false (null и false в php)
При работе с JSON возможны ошибки: некорректная кодировка, превышение глубины вложенности. Всегда проверяйте результат через json_last_error().
Как обрабатывать XML в PHP?
XML (eXtensible Markup Language) используется в устаревших системах, RSS‑лентах и конфигурациях. PHP предлагает два основных подхода: SimpleXML и DOMDocument.
SimpleXML – удобен для простых документов. Загрузка из строки или файла:
$xml = simplexml_load_file('data.xml');
foreach ($xml->item as $item) {
echo $item->title;
}Php get started (начало работы с php)
Ошибки возникают при невалидном XML. Для обработки используют libxml_use_internal_errors(true).
DOMDocument – дает полный контроль. Создание нового документа:
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('root');
$dom->appendChild($root);
echo $dom->saveXML();Custom index php (создание собственного index.php)
Проблемы: работа с пространствами имён, большие файлы.
Как сохранить сложные структуры данных в PHP без потери типов?
Сериализация через serialize() и unserialize() позволяет сохранять любые значения, включая объекты. Пример:
$object = new stdClass();
$object->property = 'value';
$serialized = serialize($object);
$restored = unserialize($serialized);Важно: не используйте unserialize() с данными от пользователя – это приводит к уязвимостям. Для безопасной работы применяйте json_decode или unserialize с опцией ['allowed_classes' => false]. Формат зависит от версии PHP, поэтому файлы могут быть несовместимы между разными версиями.
Типичные ошибки
- При JSON: некорректные символы в строках (не UTF‑8). Решение – принудительная перекодировка через
mb_convert_encoding(). - При XML: отсутствие обработки ошибок парсинга. Включайте libxml_use_internal_errors(true) и проверяйте
libxml_get_errors(). - При serialize: попытка десериализовать данные из ненадёжного источника. Всегда используйте валидацию и белый список классов.
Расширенные примеры работы с форматами данных
1. JSON с кастомными объектами и фильтрацией
class User {
public $name;
protected $password;
public function __construct($name, $password) {
$this->name = $name;
$this->password = $password;
}
// Реализация JsonSerializable
public function jsonSerialize(): mixed {
return ['name' => $this->name]; // исключаем пароль
}
}
$user = new User('Иван', 'secret');
echo json_encode($user, JSON_UNESCAPED_UNICODE);
// Результат: {"name":"Иван"}{"name":"Иван"}2. XML с XPath для поиска данных
$xml = simplexml_load_string('<catalog><book id="1"><title>PHP Basics</title></book><book id="2"><title>Advanced PHP</title></book></catalog>');
$result = $xml->xpath('//book[title="PHP Basics"]');
foreach ($result as $book) {
echo $book['id'];
}
// Результат: 11
3. Сериализация с контролем классов
class SafeObject {
public $data = 'safe';
}
$serialized = serialize(new SafeObject());
// Безопасная десериализация – только разрешённые классы
$object = unserialize($serialized, ['allowed_classes' => ['SafeObject']]);
var_dump($object);
// Результат: object(SafeObject)#1 (1) { ["data"]=> string(4) "safe" }object(SafeObject)#1 (1) { ["data"]=> string(4) "safe" }4. Создание RSS фида на XML с помощью DOMDocument
$dom = new DOMDocument('1.0', 'UTF-8');
$rss = $dom->createElement('rss');
$rss->setAttribute('version', '2.0');
$channel = $dom->createElement('channel');
$title = $dom->createElement('title', 'Мой блог');
$channel->appendChild($title);
$item = $dom->createElement('item');
$item->appendChild($dom->createElement('title', 'Первая запись'));
$channel->appendChild($item);
$rss->appendChild($channel);
$dom->appendChild($rss);
header('Content-Type: application/rss+xml');
echo $dom->saveXML();<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Мой блог</title>
<item>
<title>Первая запись</title>
</item>
</channel>
</rss>5. Обработка больших JSON потоков (streaming)
// Предположим, есть большой файл large.json
$handle = fopen('large.json', 'r');
$decoder = new JsonStreamingParser\Parser($handle, function ($data) {
// обработка каждого элемента
});
$decoder->parse();
fclose($handle);
// Этот подход требует установки библиотеки JsonStreamingParser(нет прямого вывода, данные обрабатываются по частям)