PHP 魔术方法 - __sleep()
如果要将一个对象保存起来,那么你一定会用到 serialize()
会把实例的所有属性,不管是公开可见的还是私有的,都给序列化了,例如下面的代码
<?php class Person { public $name; public $age; private $sex = "Male"; public function __construct($name = '',$age=22) { $this->name = $name; $this->age = $age; } } $person = new Person('Yufei',30); echo serialize($person);
运行结果如下
[yufei@localhost php]$ php demo.php O:6:"Person":3:{s:4:"name";s:5:"Yufei";s:3:"age";i:30;s:11:"Personsex";s:4:"Male";}
但这往往不是我们所需要的,而且,我们有可能也要剔除某些公开的属性,比如 $age
,这种情况下,我们要怎么做呢 ?
别急,哈哈,PHP 提供了魔术方法 __sleep()
可以定制序列化结果
魔术方法 __sleep()
魔术方法 __sleep()
,我觉得是 PHP 取的,为数不多的,名字特别有意思的函数了,把一个对象序列化成为字符串,就可以保存起来了,保存在文件系统中,或数据库中,看起来不就是 「 睡着 」了一样么 ?
当调用 serialize()
函数序列化一个实例时,会首先检查该实例是否存在 __sleep()
方法,如果该方法存在,则自动调用,否则使用默认的序列化方式。
我们可以给一个类定义 __sleep()
方法来定制类的实例的序列化输出结果,剔除哪些不是必须序列化的属性,比如保存了超大数据的属性。
__sleep()
方法的原型如下
public array function __sleep() { // 定制序列化结果 }
该魔术方法没有任何参数,但有且必须一定有返回值,返回值是一个数组,它包含了想要序列化的该实例的属性名
其实,我们还可以在
__sleep()
方法给实例添加一些属性
范例
下面的代码,我们将修改本章节最开始的范例,剔除 $sex
属性,并且添加一些额外的属性 $school
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } /** * @return array */ public function __sleep() { echo "但使用 serialize() 方法序列化实例时,会自动调用此方法\n"; $this->name = base64_encode($this->name); $this->school = 'HuaQiao'; return array('name', 'age','school'); } } $person = new Person('Yufei'); echo serialize($person),"\n";
输出结果如下
[yufei@localhost php]$ php demo.php 但使用 serialize() 方法序列化实例时,会自动调用此方法 O:6:"Person":3:{s:4:"name";s:8:"WXVmZWk=";s:3:"age";i:25;s:6:"school";s:7:"HuaQiao";}