0
点赞
收藏
分享

微信扫一扫

PHP魔法方法之__sleep()方法和__wakeup()方法


  • 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__当前命名空间的名称

举报

相关推荐

0 条评论