Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Корзина товаров и оформление заказа || Библиотека jQuery >>>

Сериализация php

05.04.2012
Сериализация 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, и это уже никак не повлияет на сериализованную строку.

Также в этом промежутке мы можем полученную строку передать в другой скрипт, или записать в БД. Последующие действия демонстрируют процесс сериализации и дессериализации, выводя данные на экран. Я уверен, в том, что если вы запустите этот скрипт, то вам сразу станет ясна его работа.

Пример сериализации php

Вот так будет выглядеть объект $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 ленту блога.

Нравится

Комментарии

  • Yura

    Blagadary.

  • Артем

    Спасибо, магии в пхп стало чуть меньше.
    Понимаю, что статья пыльная, но, кроме сериализации есть еще методы передачи экземпляра класса между страницами?

  • Оставить комментарий

    Не отвечать

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика