PHP Velho Oeste 2024

Сериализация объектов - объекты в сессиях

Функция serialize() возвращает строку, содержащую поток байт, представляющий любые значения, которыми может оперировать PHP. Функция unserialize() служит для превращения этой строки обратно в переменные PHP. Использование сериализации с объектом, сохраняет все переменные объекта и имя его класса. Функции объекта не сохраняются.

Чтобы можно было использовать unserialize() для объекта, необходимо, чтобы его класс был определен. Так что, если у вас есть объект $a класса A в page1.php и вы его сериализовали, вы получите строку, содержащую значение всех переменных $a и его имя. Если вы захотите восстановить $a в файле page2.php, определение класса A должно обязательно присутствовать в файле page2.php. Этого можно достичь, например, описывая класс в отдельном файле и включая его туда, гдже он будет нужен. В нашем случав в page1.php и page2.php.

<?php
// classa.inc:
  
  
class {
      var 
$one 1;
    
      function 
show_one() {
          echo 
$this->one;
      }
  }
  
// page1.php:

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// Сохраняем $s там, где page2.php сможет его найти.
  
$fp fopen("store""w");
  
fwrite($fp$s);
  
fclose($fp);

// page2.php:
  
  // Это необходимо для корректной десериализации.
  
include("classa.inc");

  
$s implode("", @file("store"));
  
$a unserialize($s);

  
// теперь используем функцию show_one() объекта $a.
  
$a->show_one();
?>

Если вы пользуетесьб сессиями и используете session_register() для регистрации объектов, эти объекты сериализуются автоматически в конце каждой страницы PHP, и автоматически десериализуются в начале каждой последующей. Обычно это означает, что эти объекты доступны на любой из ваших страниц в пределах сессии.

Строго рекомендуется включать определение класса для зарегистрированных объектов на всех страницах, даже если на каких то конкретных страницах вы этот класс не используете. Если вы этого не сделаете, то ваш класс не сможет корректно десериализоваться и превратится в тыкву (__PHP_Incomplete_Class_Name), без каких либо функций и смысла.

Таким образом, если в примере выше, $a станет частью сессии, через использование session_register("a"), вы должны будете включить файл classa.inc на всех своих страницах, а не только на page1.php и page2.php.

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top