Feb 18, 2009
admin

PHP 5 Magic – __sleep() and __wakeup() methods

Hello Friends,

The magic method _sleep() and _wakeup() is called when an object is serialized. The magic method _sleep() and _wakeup() provides a method to clean up and restore objects before being serialized.

Working with _sleep()

_sleep() magic method is called when the object of a class is about to be serialized. This magic method _sleep() does not accept any parameter and returns an array. The array should contain a list of class members that should be serialized. This means that if you don’t wish to serialize a particular class member, you should not include it in the array. Look at the example below:

class Customer {
private $name;
private $credit_card_number;public function setName($name) {
$this->name = $name;
}

public function getName() {
return $this->name;
}

public function setCC($cc) {
$this->credit_card_number = $cc;
}

public function getCC() {
return $this->credit_card_number;
}

public function __sleep() {
return array(“name”); //because of this, only name is serialized
}

}

$c = new Customer();
$c->setName(“Timir”);
$c->setCC(“1234567890123456″);

$data = serialize($c).”\n”;
echo $data.”\n”;

Output:
O:8:”Customer”:1:{s:14:” Customer name”;s:5:”Timir”;}

” In the above example, you can see that the serialized string data only contains the name of the Customer Object. This is because the _sleep() magic method returned an array containing only the ‘name’ data member. “

Working with the magic method __wakeup()

_wakeup() magic method is the opposite of the _sleep() method. It is called when the object of a class is about to be unserialized. This magic method _wakeup() does not accept any parameter nor returns anything. The _wakeup() method is responsible for setup operations after an object has been unserialized. Look at the example below:

class Customer {
private $name;
private $credit_card_number;

public function setName($name) {
$this->name = $name;
}

public function getName() {
return $this->name;
}

public function setCC($cc) {
$this->credit_card_number = $cc;
}

public function getCC() {
return $this->credit_card_number;
}

public function __sleep() {
return array(“name”);
}

public function __wakeup() {
if($this->name == “Timir”) {
//you would ideally fetch CC data from Database
$this->credit_card_number = “1234567890123456″;
}
}
}

$c = new Customer();
$c->setName(“Timir”);
$c->setCC(“1234567890123456″);

$data = serialize($c).”\n”;
var_dump(unserialize($data));

Output:
object(Customer)#2 (2) {
[”name:private”]=>
string(5) “Timir”
[”credit_card_number:private”]=>
string(16) “1234567890123456″
}

In the above example, you can see that after the $c object has been serialized and the output stored in $data variable, we use the $data variable and pass it to the unserialize(). Before the object is unserizlied and object created, the __wakeup() method is called. In the __wakeup() method you should ideally make a database call to fetch data of the missing member variable.

Please leave comment or any question about this post.

PHP Genious Services

I am a PHP freelancer india, PHP Developer india, PHP programmer india, Wordpress Freelancer india, Wordpress customization services, Wordpress Plugin Developer, Wordpress theme customization, Wordpress plugin customization, Magento Freelancer, Magento Developer india, Magento customization services, Magento theme integration, Opencart Developer india, Zencart Freelancer, Opencart customization, Opencart plugin development, HTML and CSS customization, cakePHP Developer, cakePHP Freelancer india, Ecommerce Developer india

Click Here for

Follow me on Facebook

Categories

Get Adobe Flash playerPlugin by wpburn.com wordpress themes