顾名思义的方法,休眠与唤醒,可以将类进行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 会影响实际效率,而且会占用磁盘空间哦,
不过像案例中这种,占用空间就比较小,可以考虑下