__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:
Bovenstaand script zal als output hebben:
Als ik nu deze string in een ander scriptje handmatig invoer en unserialize(), dan kan ik weer gewoon m'n $array gebruiken:
2
3
4
5
6
7
8
$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:
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.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
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
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();
}
}
?>
Inhoudsopgave
- Inleiding
- __construct
- __destruct
- __sleep & __wakeup
- __toString
- __clone
- __autoload
- __set_state
- __get, __set, __call, __isset, __unset
- Links