As funções mágicas __sleep e __wakeup

serialize() verifica se sua classe possui um método com o nome mágico __sleep. Se houver, ele será executado antes de qualquer serialização. Ele pode ser utilizado para fazer uma limpeza no objeto, e é esperado que retorne um array com os nomes de todos as variáveis deste objeto que devem ser serializados. Caso o método não retorne nada, NULL será serializado e um E_NOTICE será lançado.

O objetivo de uso do __sleep é confirmar dados pendentes ou realizar tarefas de limpezas. A função é também útil quando você está lidando com objetos muito grandes e que não precisam ser completamente salvos.

No caso inverso, unserialize() verifica a presença de um método com o nome mágico __wakeup. Caso exista, será chamado e poderá reconstruir qualquer recurso que este objeto pode ter.

A inteção de utilização do __wakeup é reestabelecer quaisquer conexões com banco de dados que podem ter sido perdidas durante a serialização e realizar outras tarefas de reinicialização.

add a note add a note

User Contributed Notes 3 notes

up
3
Ninsuo
4 months ago
If you want to serialize all but one properties, you can use:

<?php

class A
{

   protected
$a = 1;
   protected
$b = 2;
   protected
$c = 3;
   protected
$d = 4; // unwanted

   
public function __sleep()
    {
        return
array_diff(array_keys(get_object_vars($this)), array('d'));
    }
   
}
up
-3
Ninsuo
4 months ago
If you want to serialize all but one properties, you can use:

<?php

class MyClass
{
   protected
$a;
   protected
$b;
   protected
$c;
   protected
$d; // unwanted

   
public function __sleep()
    {
        return
array_diff(get_object_vars($this), array('d'));
    }

}
up
-28
ranware2200 at yahoo dot com
4 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