- 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__当前命名空间的名称
明天你还会更新的吧,明天我在来.
这个真的有用吗http://www.mdjsshfly.info
http://www.jinhuazx.com专门支持原创文章
专程来顶你bycic
自己学习php也有一段时间另外,但是还没用到这个函数呢,学习了