Сериализация php
Здравствуйте уважаемые читатели блога, здравствуйте уважаемые читатели, в этой статье я приведу примеры php сериализации.
Но для начала давайте выясним, что же это за страшное слово, и причем
тут программирование. Не знаю, как у вас, но у меня слово сериализация
стоит в одном ассоциативном ряду с сериалами. На самом деле сериалы и процесс сериализации данных в php никак не соотносятся друг с другом.
Сериализация - процесс конвертирования сложной структуры языка программирования в строку, для компактной передачи данных.
Десериализация - процесс конвертирования строки полученной при сериализации обратно в сложную структуру.
Для чего и как используется
Сериализация, в php имеет с первого взгляда
непонятное назначение, но очень полезное в программировании крупных
систем, в которых идет плотная работа с сохранением и передачей
информации. Представьте, что перед вами стоит задача, передать какую
либо структуру данных (массив, объект, список, и др.) из одного скрипта
в другой, возможно даже находящийся на другом сервере. Так как каждая
из структур является набором информации со сложными взаимосвязями, не
плохо бы до передачи, конвертировать ее в одну строку, и впоследствии
делать с ней все что угодно (сохранять в БД, отсылать на другой сервер, и
т.д.). Если подумать , то мы поймем, что действительно без процесса
сериализации данных тут не обойтись.
После получения сериализованной строки, мы сможем сохранить ее в БД
до лучших времен, или отправить через поля форм <input>, и даже
передать в контексте url. Ровно также как и при реализации корзины в интерет магазине, мы сможем сохранить строку в cookies .
Соответственно, если мы конвертировали какой либо объект в строку, и
передали его куда-то, то на другой стороне нам придется работать с этой
строкой и вернуть ей первозданный вид. Для этого мы воспользуемся
обратным процессом и десериализуем строку в объект.
PHP функции сериализации и десериализацииДля того чтобы сериализовать объект в строку и обратно, мы может воспользоваться уже рассмотренным ранее форматом JSON, но это уже немного изощрённый подход, в обычных же случаях нам подойдут две базовые php функции:
- serialize() – Конвертирует полученный объект в строку для хранения и передачи.
- unserialize() – Конвертирует строку в объект для дальнейшей работы с ним.
Простой php пример сериализации объекта
| <?php
class Product
{
public $product_name = "";
private $available = false;
public function setAvailable() {
$this->available = true;
}
public function unsetAvailable() {
$this->available = false;
}
public function getInfo() {
return $this->available;
}
}
$item = new Product();
$item->product_name = "Пылесос";
$item->setAvailable();
$itemString = serialize($item);
//.. тут могут осуществляться любые действия на $item..//
print "<hr/>1) Объект <b>\$item:</b> <pre>";print_r($item); print "</pre><hr/>";
print "2) Сериализованный в строку объект <b> \$item</b> <pre>";print_r($itemString); print "</pre><hr/>";
print "3) Десериализация полученной строки в новый объект <b>\$backup_item</b>:<hr/>";
$backup_item = unserialize($itemString);
print "4) Восстановленный из строки объект <b> \$backup_item</b> <pre>";print_r($backup_item); print "</pre><hr/>";
print "5) Получаем поле \"название\" восстановленного объекта <b> \$backup_item->product_name</b> <pre>".$backup_item->product_name."</pre><hr/>";
?> |
Коротко опишу суть приведенного кода. Объявляется класс Product, в котором содержится два поля: $product_name – наименование продукта и $available –флаг наличия на складе. Причем второе поле private доступно только внутри методов данного класса. Далее в скрипте мы создаем экземпляр класса Product, а именно объект $item.
Делаем над полями объекта определенные действия и сериализуем его в
строку. Следом за сериализацией в скрипте мы может делать абсолютно
любые действия над $item, и это уже никак не повлияет на сериализованную строку.
Также в этом промежутке мы можем полученную строку передать в другой
скрипт, или записать в БД. Последующие действия демонстрируют процесс
сериализации и дессериализации, выводя данные на экран. Я уверен, в
том, что если вы запустите этот скрипт, то вам сразу станет ясна его
работа.
Вот так будет выглядеть объект $item, в сериализованном виде:
| O:7:"Product":2:{s:12:"product_name";s:7:"Пылесос";s:18:"Productavailable";b:1;} |
Не пугайтесь , понять это не так сложно как кажется.
- O:7:”Product”:2: – объект класса "Product”, в названии 7 символов, содержит 2 поля.
- s:12:”product_name” – строковая переменная, название поля "product_name” из 12 символов.
- s:7:”Пылесос” – строка из 7 символов "Пылесос”.
- b:1 – булево значение true;
Не смотря на то, что для работы с сериализацией php не важно понимать смысла закодированной строки, все же это может пригодиться в определенных задачах.
Поддерживаемые функцией serialize() типы данных:
| i:4; // - тип integer
s:6:"qwerty"; // - тип string
b:1; //- тип boolean
a:3:{...} //array
O:9:"TestClass":1:{...} //object |
Также для кодирования могут быть использованы символы вида \0*\0 – нуль байты.
Важные моменты:
Необходимо отметить, что если мы получаем строку в сериализованном
виде, и хотим вернуть ее в объект, для работы с его полями и методами,
то для начала нам обязательно нужно объявить класс этого объекта, в
скрипте.
Также важным является использование функции addslashes(), перед сохранением в БД объекта, ну и соответственно не забудьте применить обратную функцию stripslashes(). Если же вы работаете с НТТР протоколом, то необходимо использовать функцию urlencode().
- addslashes() – экранирует кавычки.
- stripslashes() – возвращает кавычкам человеческий вид.
- urlencode() – заменяет лишние символы на знак процента (%) с 16-ричными цифрами, а пробел меняет на плюс (+).
|