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

相关推荐

5 thoughts on “PHP魔法方法之__sleep()方法和__wakeup()方法”

Leave a Comment