PHP __sleep() 和 __wakeup() 魔術函數的使用方法

PHP 魔術函數之 __sleep()/__wakeup()
__sleep()

觸發事件:對象被序列化以前php

做用:返回須要被序列化存儲的成員屬性,刪減沒必要要數組

返回:array 須要被序列化存儲的成員屬性數組函數

__wakeup()

觸發事件:類的實例的序列化串被反序列化時this

做用:預先準備對象資源spa

返回:voidcode

實例:對象

<?php 
class Person
{
    private $name, $age, $sex, $info;

    public function __construct( $name, $age, $sex )
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
        $this->info = sprintf("prepared by construct magic functionname: %s age: %d sex: %s",
        $this->name, $this->age, $this->sex);
    }

    public function getInfo()
    {
        echo $this->info . PHP_EOL;
    }
    /**
     * serialize前調用 用於刪選須要被序列化存儲的成員變量
     * @return array [description]
     */
    public function __sleep()
    {   
        echo __METHOD__ . PHP_EOL;
        //序列化時只會存儲 name age sex, info 不會被序列化
        return ['name', 'age', 'sex'];
    }
    /**
     * unserialize前調用 用於預先準備對象資源
     */
    public function __wakeup()
    {
        echo __METHOD__ . PHP_EOL;
        $this->info = sprintf("prepared by wakeup magic function name: %s age: %d sex: %s",
        $this->name, $this->age, $this->sex);
    }
}

$boy = new Person( 'sallency', 25, 'male' );
//構造函數組裝的 $info
$boy->getInfo();
//序列化時並不會存儲 $info 屬性
$temp = serialize($boy);
echo $temp . PHP_EOL;

//反序列化時會調用 __wakeup() 函數
$boy = unserialize($temp);
//__wakeup() 組裝的 $info
$boy->getInfo();
?>
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息