PHP中的序列化
接口
Serializable { abstract public string serialize (void); abstruact public void unserialize (string $serialized); }
序列化简述:
使用serialize()保存对象中的所有变量,当对象被摧毁的时候,可以使用unserialize()重造对象。事实上,我们不需要保存对象中的方法,方法并不含有对象的属性。
使用serialize和unserialize之前,必须事先定义要序列化的对象所属的类。
serialize()会返回一个包含对象变量及其值的字符串。我们可以把该字符串保存到文件中,以便日后使用。
<?php //classa.inc: class A { public $one = 1; public function show_one() { echo $this->one; } } //page1.php include ("classa.inc"); $a = new A; $s = serialize($a); file_put_contents('store', $s); //page2.php: include ("classa.inc"); $s = file_get_contents('store'); $a = unserialize($s); $a->show_one();
再看看__sleep()和__wakeup()两个magic函数。
如果你的类中包含__sleep()函数,serialize()序列化之前会先调用__sleep()函数。__sleep()函数应该返回一个包含所有应当序列化的变量名的数组。如果__sleep()什么也不返回,序列化时会发出E_NOTICE错误。注意:私有变量无法被序列化,否则发出E_NOTIC错误。(或者可以自行实现Serializable接口)
与之相反,unserialize()会检查__wakeup()函数,如果有这个函数,则调用他。__wakeup()函数被用来重新构造object拥有的任何资源。可以用来重新建立数据库连接。
<?php class Connection { protected $link; private $dsn, $username, $password; public function __construct ($dsn, $username, $password) { $this->dsn = $dsn; $this->username = $username; $this->password = $password; $this->connect(); } private function connect() { $this->link = new PDO ($this->dsn, $this->username, $this->password); } public function __sleep() { //返回需要序列化的变量名 return array('dsn', 'username', 'password'); } public function __wakeup() { $this->connect(); } } ?>