Сериализиране на обекти - обекти в сесии

serialize() връща низ, съдържащ представяне под формата на byte-stream на всяка стойност, която PHP може да съхранява. unserialize() може да използва този низ, за да върне първоначалната стойност на променливите. При използването на serialize за съхраняване на обект ще се съхранят всички променливи на обекта. Името на класа също ще бъде запазено, но не и функциите на обекта.

За да десериализирате обекта, класът на този обект трябва да бъде дефиниран. По този начин ако имате обект $a от клас A в page1.php и го сериализирате, ще бъде върнат низ, който сочи към клас A и съдържа всички стойности на променливите в $a. Ако искате да десериализирате това в page2.php, възпроизвеждайки $a от клас A, дефиницията на клас A трябва да съществува в page2.php. Това може да бъде направено като дефиницията на клас A се съхрани във файл за вмъкване и този файл се вмъкне в 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:
  
  // това е нужно, за да може unserialize да работи коректно.
  
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