__sleep & __wakeup

__sleep wordt aangeroepen bij het gebruik van serialize() op een object. __wakeup wordt aangeroepen bij het gebruik van unserialize() op een object. Het is belangrijk goed te begrijpen wat serialize() en unserialize() doen om het nut van __sleep & __wakeup te begrijpen.

(un)serialize()
Serialize() is een functie die een variabele, waaronder een array of object, kan omzetten naar een string. Deze string kun je dan bijvoorbeeld opslaan. Als je deze string dan later weer unserialize()t, dan heb je weer de originele variabele in PHP. Voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

$array
= array('a', 'b', 'c');
echo serialize($array);

?>


Bovenstaand script zal als output hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}


Als ik nu deze string in een ander scriptje handmatig invoer en unserialize(), dan kan ik weer gewoon m'n $array gebruiken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

$string
= 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$array = unserialize($string);

print_r($array);

?>


Bovenstaand script zal als output hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Array ( [0] => a [1] => b [2] => c )



Back to magic
Ik denk dat je nu wel goed begrijpt hoe deze functies werken. Je kunt dit dus ook toepassen op een object. Zo kun je later een object opnieuw gebruiken met dezelfde instellingen en variabele-waarden binnen de klasse van het object. Omdat objecten nogal ingewikkelde datatypes zijn, heeft men in PHP 5 dus ook twee magic methods toegevoegd die aangeroepen worden bij het omzetten van object naar string. Dit heeft als nut om bijvoorbeeld je klasse op te schonen zodat bijvoorbeeld bepaalde variabelen worden teruggezet op standaard-waarden.

__sleep
__sleep wordt aangeroepen bij een serialize(), mits je __sleep hebt gedefinieerd binnen de klasse. Als je deze functie gebruikt dan moet je een array returnen met de namen van de variabelen die je opgeslagen wil hebben in je geserializede string. Als je geen waarde returnt dan wordt een E_NOTICE gegooid.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

class Foo {
    public $a, $b, $c;
    
    public function __construct() {
        $this->a = 'foobar';
        $this->b = 'raboof';
        $this->c = array('a', 'b', 'c');
    }


    public function __sleep() {
        $this->c = array('d', 'e', 'f');
        return array('b', 'c'); // $b en $c moeten geserialized worden
    }
}


$foo = new Foo;
echo serialize($foo);

?>



__wakeup
__wakeup wordt aangeroepen bij unserialize() en is bijvoorbeeld handig om een database-connectie te maken.


Praktijkvoorbeeld van PHP.net

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class Connection {
    protected $link;
    private $server, $username, $password, $db;
  
    public function __construct($server, $username, $password, $db)
    {

        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }

  
    private function connect()
    {

        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }

  
    public function __sleep()
    {

        return array('server', 'username', 'password', 'db');
    }

  
    public function __wakeup()
    {

        $this->connect();
    }
}

?>

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Inleiding
  2. __construct
  3. __destruct
  4. __sleep & __wakeup
  5. __toString
  6. __clone
  7. __autoload
  8. __set_state
  9. __get, __set, __call, __isset, __unset
  10. Links

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.