45 lines
1.7 KiB
Markdown
45 lines
1.7 KiB
Markdown
---
|
||
title: Сериализация в PHP
|
||
description: Проблема долговременного хранения сериализованных данных
|
||
keywords: [php, serialization]
|
||
---
|
||
|
||
# Сериализация в PHP
|
||
|
||
В PHP есть две функции для сериализации и десериализации данных:
|
||
`serialize()` и `unserialize()`. Функции встроены в язык,
|
||
не требуют дополнительных модулей.
|
||
|
||
В один момент кто-то решает использовать их для долговременного
|
||
хранения объектов. В базе данных, на диске, еще где-то.
|
||
|
||
```
|
||
namespace Test\Serialize;
|
||
|
||
class A {}
|
||
|
||
$a = new A();
|
||
|
||
serialize($a);
|
||
```
|
||
|
||
И тут начинаются проблемы.
|
||
|
||
Дело в том, что при сериалзации объектов классов кроме самих данных
|
||
объекта сохраняется еще и информация о классе. Его имя, пространство имен.
|
||
|
||
Результатом сериализации в примере выше будет:
|
||
|
||
```
|
||
O:16:"Test\Serialize\A":0:{}O:16:"Test\Serialize\A":0:{}
|
||
```
|
||
|
||
Если теперь произвести рефакторинг, переместить класс,
|
||
изменить пространство имен, то десериализация уже не сработает.
|
||
И будет больно.
|
||
|
||
Не делайте так.
|
||
|
||
Контролируйте процесс сериализации. Например, используйте JSON и специальные
|
||
функции для превращения объекта в массив и обратно.
|