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";}
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.