21 11 2010
魔术方法 __sleep() 和__wakeup()
顾名思义的方法,休眠与唤醒,可以将类进行Session序列化缓存,并可以持久使用。该方法很适合于Log、在线状态记录、分步注册等。
例:
Log.class.php文件
class Log { var $filename; var $fp; function Log($filename) { $this -> filename = $filename; $this -> open(); } function open() { $this -> fp = fopen($this -> filename, "a") or die("Can't open {$this->filename}"); } function write($note) { fwrite($this -> fp , "$noten"); } function read() { return join("", file($this -> filename)); } function __wakeup() { $this -> open(); } function __sleep() { fclose($this -> fp); return array('filename'); } }
然后让我们在第一页创建一个持久日志变量 $l
main.php
include_once 'Log.inc'; session_start(); $now = strftime("%c"); if(!session_is_registered('l')) { $l = new Log('/tmp/persistent_log'); session_register('l'); $l -> write('Created $now'); echo ('Created session and persistent log object'); } $l -> write('Viewed first page $now'); echo 'The log contains:'; echo nl2br($l -> read()); <a href="next.php">Move to next page </a>
让我们在第二页唤醒Log
include_once 'log.inc'; session_start(); $now = strftime("%c"); $l -> write('Viewed page 2 at $now'); echo 'The log contains:'; echo nl2br($l -> read());
我们可以看到在next.php里,我们没有声明l,却可以继续使用。
但个人认为,既然是将Class进行了序列,保存于Session中,对于属性过多的Class 会影响实际效率,而且会占用磁盘空间哦,
不过像案例中这种,占用空间就比较小,可以考虑下