Изучаем форматы данных в PHP: JSON, XML и механизм serialize

Раздел: Программирование на PHP -> Основы PHP

Основные форматы данных в 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: попытка десериализовать данные из ненадёжного источника. Всегда используйте валидацию и белый список классов.
- Default php file (файл по умолчанию в php)
- Php return file (возврат файла из функции в php)
- File php query (запрос к файлу в php)

Расширенные примеры работы с форматами данных

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'];
}
// Результат: 1
1

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
(нет прямого вывода, данные обрабатываются по частям)

Форматы данных в PHP (JSON, XML, serialize) - comments

En
Php форматы данных (php)