- public array __sleep ( void )
- void __wakeup ( void )
serialize() 函数会检查是否存在一个魔术方法 __sleep().如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法不返回任何内容,则NULL
被序列化,并产生 一个E_NOTICE
错误。
__sleep()不可能返回父类的私有属性,这样做会导致一个E_NOTICE的错误
__sleep()方法常用于提交未提交的数据,或类似的清理操作。同时,如果你有一些很大的对象, 不需要全部保存,这个功能就很好用。与之相反,unserialize()会检查是否存在一个__wakeup()方法。如果存在,则会先调用 __wakeup方法,预先准备对象需要的资源。
__wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
代码例子:
< meta http - equiv = "Content-Type" content = "text/html; charset=utf-8" >
<?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 ( )
{
print "function connect().<br>" ;
$this -> link = mysql_connect ( $this -> server , $this -> username , $this -> password ) ;
mysql_select_db ( $this -> db , $this -> link ) ;
}
/** * * serialize() 函数会检查是否存在一个魔术方法 __sleep(). * 如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。 * 这个功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。 * 如果该方法不返回任何内容,则NULL被序列化,并产生 一个E_NOTICE错误。 */
public function __sleep ( )
{
print "Magic methods__sleep().<br>" ;
return array ( 'server' , 'username' , 'password' , 'db' ) ;
}
/** * unserialize()会检查是否存在一个__wakeup()方法。 * 如果存在,则会先调用 __wakeup方法,预先准备对象需要的资源 * 注意:这里说的“对象需要的资源”,并不是说对象的属性等状态 * 这些状态在调用__wakeup之前已经存在,__wakeup只是做一些数据库连接等操作 */
public function __wakeup ( )
{
print "in methods wakeup before connect, " . $this -> server . "<br>" ;
print "Magic methods__wakeup().<br>" ;
$this -> connect ( ) ;
print "in methods wakeup after connect, " . $this -> server . "<br>" ;
}
}
//以下两个代码块,先执行第一块,再执行第二块
/*$conn = new Connection('127.0.0.1', 'root', 'root', 'text'); $ss = serialize($conn); $file = fopen('obj.txt', 'w'); fwrite($file,$ss); */
$file = fopen ( 'obj.txt' , 'r' ) ;
$ss = fread ( $file , filesize ( 'obj.txt' ) ) ;
$conn = unserialize ( $ss ) ;
?>
第一段(序列化)的执行结果:
function connect().
Magic methods__sleep().
同时,obj.txt里面是序列化的对象字符串
第二段(反序列化的)执行解雇:
in methods wakeup before connect, 127.0.0.1
Magic methods__wakeup().
function connect().
in methods wakeup after connect, 127.0.0.1
总结:魔法方法是在某一个时刻,被自动调用的函数,类似于操作符重载,这里的sleep发生在序列化之前,wake发生在反序列化之前。
PHP其他一些魔法方法:
__destruct()当删除一个对象或对象操作终止的时候调用该方法
__get()当试图读取一个并不存在的属性的时候被调用
__set()当试图向一个并不存在的属性写入值的时候被调用
__call()当试图调用一个对象并不存在的方法时调用该方法
__toString()当打印一个对象的时候被调用
__clone()当对象被克隆时被调用
__sleep()当对象被串行化时调用
__wakeup()当对象被反串行化时调用
__invoke()在代码试图把对象当作函数来使用时候调用
__autoload()简单的说就是类的自动加载
__LINE__文件中的当前行号
__FILE__文件的完整路径和文件名
__DIR__文件所在的目录
__FUNCTION__函数名称
__CLASS__类的名称
__METHOD__类的方法名
__NAMESPACE__当前命名空间的名称
标签:__,调用,sleep,connect,wakeup,序列化,方法 From: https://blog.51cto.com/peishuai/6042073