Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Сериализация php
Здравствуйте уважаемые читатели блога LifeExample, здравствуйте уважаемые читатели, в этой статье я приведу примеры php сериализации. Но для начала давайте выясним, что же это за страшное слово, и причем тут программирование. Не знаю, как у вас, но у меня слово сериализация стоит в одном ассоциативном ряду с сериалами. На самом деле сериалы и процесс сериализации данных в php никак не соотносятся друг с другом.
Сериализация — процесс конвертирования сложной структуры языка программирования в строку, для компактной передачи данных.
Десериализация — процесс конвертирования строки полученной при сериализации обратно в сложную структуру.
Для чего и как используется
Сериализация, в php имеет с первого взгляда непонятное назначение, но очень полезное в программировании крупных систем, в которых идет плотная работа с сохранением и передачей информации. Представьте, что перед вами стоит задача, передать какую либо структуру данных (массив, объект, список, и др.) из одного скрипта в другой, возможно даже находящийся на другом сервере. Так как каждая из структур является набором информации со сложными взаимосвязями, не плохо бы до передачи, конвертировать ее в одну строку, и впоследствии делать с ней все что угодно (сохранять в БД, отсылать на другой сервер, и т.д.). Если подумать , то мы поймем, что действительно без процесса сериализации данных тут не обойтись.
После получения сериализованной строки, мы сможем сохранить ее в БД до лучших времен, или отправить через поля форм <input>, и даже передать в контексте url. Ровно также как и при реализации корзины в интерет магазине, мы сможем сохранить строку в cookies .
Соответственно, если мы конвертировали какой либо объект в строку, и передали его куда-то, то на другой стороне нам придется работать с этой строкой и вернуть ей первозданный вид. Для этого мы воспользуемся обратным процессом и десериализуем строку в объект.
PHP функции сериализации и десериализации
Для того чтобы сериализовать объект в строку и обратно, мы может воспользоваться уже рассмотренным ранее форматом JSON, но это уже немного изощрённый подход, в обычных же случаях нам подойдут две базовые php функции:
- serialize() – Конвертирует полученный объект в строку для хранения и передачи.
- unserialize() — Конвертирует строку в объект для дальнейшей работы с ним.
Простой php пример сериализации объекта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?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, в сериализованном виде:
1 | 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() типы данных:
1 2 3 4 5 | 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-ричными цифрами, а пробел меняет на плюс (+).
Вот я и поведал вам уважаемые читатели о том что такое сериализация php данных. Задавайте вопросы в комментариях, подписывайтесь на рассылку новых статей по e-mail или RSS ленте.
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Комментарии
Blagadary.
Спасибо, магии в пхп стало чуть меньше.
Понимаю, что статья пыльная, но, кроме сериализации есть еще методы передачи экземпляра класса между страницами?