php魔术方法(三)类的序列化和反序列化

上回说了,在PHP中,对于不存在方法和属性的操作。下面介绍另外一个特性。在魔术方法中,有个__sleep() 和 __weekup()。
__sleep()  当我们对类进行序列化操作的时候,serialize()函数会检查类中有没有__sleep()这个魔术方法,如果存在,则会优先调用这个方法。这时候,我们可以当前对象中想被序列化的变量名称组成的数组,利用这个方法返回。
__wakeup() 与__sleep相反,在unserialize()的时候,就会先查看这个方法是否存在。
需要注意的是,sleep的时候,不能返回父类中私有成员的名称。
让我们看一个例子:
class Connection 
{
    protected $link;
    private $server, $username, $password, $db;

    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }

    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }

    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }

    public function __wakeup()
    {
        $this->connect();
    }
}
现在当我们序列化这个类的时候,我们连接数据库的信息就会被保存起来,而当我们反序列化的时候,数据库通过wakeup连接成功。
### PHP 序列化反序列化魔术方法 #### __sleep 方法触发机制 `__sleep()` 是 PHP 中的一个魔术方法,在对象被序列化之前自动调用。此方法可以返回一个数组,指定哪些属性应该被序列化。通过这种方式,开发人员可以选择只保存重要的数据成员,从而减少存储空间并提高安全性。 ```php <?php class Peak { public $name = "1stPeak"; public $sex = "man"; public $age = "18"; public function __sleep() { return ['age']; // 只序列化 age 属性 } } $a = new Peak; echo serialize($a); ?> ``` 上述代码只会序列化 `age` 属性[^2]。 #### __wakeup 方法触发机制 `__wakeup()` 魔术方法会在对象从字符串恢复成对象之后立即调用。该方法通常用于重新建立数据库连接、初始化资源或其他任何需要在反序列化完成后执行的任务。 ```php <?php class Test { public $sex; public $name; public $age; public function __wakeup(){ echo '当外部实体使用unserialize时会调用这里的wakeup()方法<br>'; $this->age = 556; // 设置默认年龄值 } } $person = new Test(); $person->name = 'spaceman'; $person->age = 21; $person->sex = '男'; $a = serialize($person); var_dump(unserialize($a)); ?> ``` 这段代码展示了如何利用 `__wakeup()` 来设置某些初始参数或打印调试信息[^5]。 #### 安全性最佳实践 为了增强应用程序的安全性,建议: - 在 `__sleep()` 方法中仅包含必要的属性,避免暴露敏感信息。 - 利用 `__wakeup()` 进行验证清理工作,确保对象处于有效状态。 这样做有助于防止潜在的安全漏洞,特别是在处理来自不可信源的数据时[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值