Les fonctions magiques __sleep et __wakeup

serialize() s'assure que votre classe a une méthode avec le nom magique __sleep. Si c'est le cas, cette fonction est appelée avant toute linéarisation. Elle peut alors nettoyer l'objet et on s'attend à ce qu'elle retourne un tableau avec la liste des noms de variables qui doivent être sauvées. Si la méthode ne retourne rien, alors NULL est linéarisé et une alerte de type E_NOTICE sera émise.

Le but avoué de __sleep est de valider les données en attente ou d'effectuer des opérations de nettoyage. Cette fonction est aussi pratique si vous avez de très grands objets qui n'ont pas besoin d'être sauvés entièrement.

À l'inverse, unserialize() s'assure de la présence de la fonction magique __wakeup. Si elle existe, cette fonction reconstruit toutes les ressources d'un objet.

Le but de cette fonction __wakeup est de rétablir toutes les connexions aux bases de données, et de recréer les variables qui n'ont pas été sauvées.

add a note add a note

User Contributed Notes 1 note

up
-6
ranware2200 at yahoo dot com
3 years ago
This is a simple example of how to implement serialization using the __sleep and __wakeup magic methods...

<?php
//student.class.php
class Student{
    private
$full_name = '';
    private
$score = 0;
    private
$grades = array();
   
    public function
__construct($full_name, $score, $grades)
    {
       
$this->full_name = $full_name;
       
$this->grades = $grades;
       
$this->score = $score;
    }
   
    public function
show()
    {
        echo
$this->full_name;
    }
   
    function
__sleep()
    {
        echo
'Going to sleep...';
        return array(
'full_name', 'grades', 'score');
    }
   
    function
__wakeup()
    {
        echo
'Waking up...';
    }
}
?>

<?php
//a.php
include 'student.class.php';

$student = new Student('bla bla', 'a', array('a' => 90, 'b' => 100));
$student->show();
echo
"<br />\n";
$s = serialize($student);
echo
$s ."<br />\n";
$fp = fopen('./uploads/session.s', 'w');
fwrite($fp, $s);
fclose($fp);
?>

<?php
//b.php
include 'student.class.php';

$s = implode('', file("./uploads/session.s"));
echo
$s ."<br />\n";
$a = unserialize($s);
$a->show();
?>
To Top