|
Monday, 16 March 2009
|
HTML clipboard
Magic Methods
The function names __construct, __destruct (see
Constructors and Destructors), __call, __callStatic, __get,
__set, __isset, __unset (see Overloading), __sleep,
__wakeup, __toString, __set_state and __clone are magical
in PHP classes. You cannot have functions with these names in any of your
classes unless you want the magic functionality associated with them.
Caution
PHP reserves all function names starting with __ as
magical. It is recommended that you do not use function names with __ in PHP
unless you want some documented magic functionality.
__sleep and __wakeup
serialize() checks if your class has a function with the
magic name __sleep. If so, that function is executed prior to any
serialization. It can clean up the object and is supposed to return an array
with the names of all variables of that object that should be serialized. If
the method doesn't return anything then NULL is serialized
and E_NOTICE is issued.
The intended use of __sleep is to commit pending data
or perform similar cleanup tasks. Also, the function is useful if you have
very large objects which do not need to be saved completely.
Conversely, unserialize() checks for the presence of a
function with the magic name __wakeup. If present, this function can
reconstruct any resources that the object may have.
The intended use of __wakeup is to reestablish any
database connections that may have been lost during serialization and
perform other reinitialization tasks.
Example #1 Sleep and wakeup
<?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();
}
}
?>
__toString
The __toString method allows a class to decide how it
will react when it is converted to a string.
Example #2 Simple example
<?php
class
TestClass
{
public $foo;
public
function __construct($foo)
{
$this->foo
= $foo;
}
public
function __toString()
{
return $this->foo;
}
}
$class =
new TestClass('Hello');
echo $class;
?>
The above example will output:
It is worth noting that before PHP 5.2.0 the __toString
method was only called when it was directly combined with echo() or print().
Since PHP 5.2.0, it is called in any string context (e.g. in printf() with
%s modifier) but not in other types contexts (e.g. with %d
modifier). Since PHP 5.2.0, converting objects without __toString
method to string would cause E_RECOVERABLE_ERROR.
__set_state
This static method is called for classes exported by
var_export() since PHP 5.1.0.
The only parameter of this method is an array containing
exported properties in the form array('property' => value, ...).
Example #3 Using __set_state (since PHP 5.1.0)
<?php
class A
{
public $var1;
public $var2;
public
static function __set_state($an_array)
{
$obj = new A;
$obj->var1
= $an_array['var1'];
$obj->var2
= $an_array['var2'];
return $obj;
}
}
$a = new
A;
$a->var1
= 5;
$a->var2
= 'foo';
eval('$b = ' . var_export($a,
true) .
';');
var_dump($b);
?>
The above example will output:
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
|
|
Last Updated ( Monday, 16 March 2009 )
|