如果说 __sleep() 是白的,那么 __wakeup() 就是黑的了。
那么为什么呢?
因为:
与之相反,`unserialize()` 会检查是否存在一个 `__wakeup()` 方法。如果存在,则会先调用 `__wakeup` 方法,预先准备对象需要的资源。
作用:
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
还是看代码:
<?php
class
Person
{
public
$sex
;
public
$name
;
public
$age
;
public
function
__construct(
$name
=
""
,
$age
=25,
$sex
=
'男'
)
{
$this
->name =
$name
;
$this
->age =
$age
;
$this
->sex =
$sex
;
}
/**
* @return array
*/
public
function
__sleep() {
echo
"当在类外部使用serialize()时会调用这里的__sleep()方法<br>"
;
$this
->name =
base64_encode
(
$this
->name);
return
array
(
'name'
,
'age'
);
// 这里必须返回一个数值,里边的元素表示返回的属性名称
}
/**
* __wakeup
*/
public
function
__wakeup() {
echo
"当在类外部使用unserialize()时会调用这里的__wakeup()方法<br>"
;
$this
->name = 2;
$this
->sex =
'男'
;
// 这里不需要返回数组
}
}
$person
=
new
Person(
'小明'
);
// 初始赋值
var_dump(serialize(
$person
));
var_dump(unserialize(serialize(
$person
)));
运行结果:
当在类外部使用serialize()时会调用这里的__sleep()方法
string(58)
"O:6:"
Person
":2:{s:4:"
name
";s:8:"
5bCP5piO
";s:3:"
age
";i:25;}"
当在类外部使用serialize()时会调用这里的__sleep()方法
当在类外部使用unserialize()时会调用这里的__wakeup()方法
object(Person)#2 (3) { [
"sex"
]=> string(3)
"男"
[
"name"
]=> int(2) [
"age"
]=> int(25) }
未经允许不得转载:PHP100中文网 - 中国第一档PHP资源分享门户 » PHP中 __wakeup()方法详解