serialize() erzeugt einen String, welcher die Byte-Stream-Repräsentation eines jeden Wertes besitzt, der in PHP gespeichert werden kann. unserialize() kann diesen String verwenden, um die ursprünglichen Variablenwerte wiederherzustellen. Verwendet man serialize(), um ein Objekt zu speichern, so werden alle Variablen dieses Objektes gespeichert. Die Methoden des Objektes werden nicht gespeichert, nur der Name der Klasse.
Damit man imstande ist, ein Objekt mit unserialize() wiederherzustellen, muss die Klasse des Objektes definiert sein. Das heißt, wenn man ein Objekt der Klasse A serialisiert, erhält man einen String, der sich auf die Klasse A bezieht und die Werte aller darin enthaltenen Variablen beinhaltet. Wenn man in einer anderen Datei diesen String wieder zu einem Objekt der Klasse A deserialisieren will, so muss die Klasse A in dieser Datei vorher bekannt sein. Dies kann man erreichen, indem man die Definition der Klasse A in eine mittels include ladbare Datei auslagert und diese Datei einbindet oder die Funktion spl_autoload_register() verwendet.
<?php
// classa.inc:
class A {
public $one = 1;
public function show_one() {
echo $this->one;
}
}
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a);
// $s irgendwo ablegen, wo page2.php dies finden kann.
file_put_contents('store', $s);
// page2.php:
// Dies ist nötig, damit unserialize korrekt funktioniert.
include("classa.inc");
$s = file_get_contents('store');
$a = unserialize($s);
// Nun kann man die Funktion show_one() des Objektes $a
// verwenden.
$a->show_one();
?>
Wenn eine Anwendung Sessions verwendet und die Funktion session_register() benutzt, um Objekte zu registrieren, so werden diese Objekte automatisch am Schluss jeder PHP-Seite serialisiert und in jeder nachfolgenden PHP-Seite deserialisiert. Das heißt, dass diese Objekte in jeder Seite der Anwendung auftauchen können, sobald diese Teil der Session werden. Beachten Sie im Bezug auf session_register(): Dieses veraltete Feature wird in der Zukunft sicherlich entfernt.
Es ist dringend empfohlen, dass wenn eine Anwendung Objekte zur späteren Verwendung in der Anwendung serialisiert, die Klassendefinitionen in der gesamten Anwendung eingebunden werden. Wird dies nicht beachtet, so wird das Objekt ohne eine Klassendefinition deserialisiert, was dazu führen wird, dass PHP dem Objekt eine Klasse __PHP_Incomplete_Class_Name zuweisen wird, welche keine Methoden besitzt. Dies wird das Objekt nutzlos machen.
Wenn also im obigen Beispiel $a Teil einer Session würde, indem man session_register("a") benutzt, so sollte die Datei classa.inc in jeder Seite eingebunden werden, nicht nur in page1.php und page2.php.
PHP OBJECT SERIALIZATION
I use a database to store info rather than storing PHP Objects themselves. However, I find that having a PHP Object acting as an interface to my db is way useful. For example, suppose I have a TABLE called 'user' that looks like this.
CREATE TABLE user {
user_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_first VARCHAR(24) NOT NULL,
user_last VARCHAR(24) NOT NULL,
PRIMARY KEY (user_id)
);
Then I would create a PHP Class definition like so:
<?php
require('includes/db_connect.php');
class User
{
protected $user_id;
protected $user_first;
protected $user_last;
public function __construct($id, $first, $last)
{
$this->user_id = $id;
$this->user_first = $first;
$this->user_last = $last;
}
# FUNCTIONS TO RETRIEVE INFO - DESERIALIZE.
public static function db_user_by_id($dbc, $id)
{
$query = "SELECT * FROM user WHERE user_id=$id LIMIT 1";
return User::db_select($dbc, $query);
}
public static function db_user_by_name($dbc, $first, $last)
{
$query = "SELECT * FROM user WHERE user_first='$first' AND user_last='$last' LIMIT 1";
return User::db_select($dbc, $query);
}
protected static function db_select($dbc, $query);
{
$result = mysqli_query($dbc, $query);
if(mysqli_num_rows($result) > 0)
{
$row = mysqli_fetch_array($result, MYSQLI_NUM);
return new User($row[0], $row[1], $row[2]);
}
}
# FUNCTIONS TO SAVE INFO - SERIALIZE.
public function insert($dbc)
{
$query = "INSERT INTO user VALUES (NULL, '$this->user_first', '$this->user_last')";
$result = mysqli_query($dbc, $query);
}
public function update($dbc)
{
$query = "UPDATE user SET user_first='$this->user_first', user_last='$this->user_last' WHERE user_id=$this->id LIMIT 1";
$result = mysqli_query($dbc, $query);
}
# GETTER and SETTER FUNCTIONS - DO NOT ALLOW SETTING OF ID
public function getId() {return $this->user_id;)
public function getFirst() {return $this->user_first;)
public function getLast() {return $this->user_last;)
public function setFirst($first) {$this->user_first = $first;}
public function setLast($last) {$this->user_last = $last;}
# CUSTOM FUNCTIONS
public function getFullName() {return $this->user_first . ' ' . $this->user_last;}
public function getLastFirst() {return $this->user_last . ', ' . $this->user_first;}
}
?>
Using PHP Objects for SERIALIZATION and DESERIALIZATION is now super-easy, for example:
<?php
require('User.php');
// INSERT a new user.
$user = new User(0, 'Frank', 'American');
$user->insert($dbc); // done!
// UPDATE an existing user.
$user = User::db_user_by_id($dbc, 223);
$user->setFirst('Johnny');
$user->update($dbc); // done!
mysqli_close($dbc);
?>
Note that static members of an object are not serialized.