PHP物件導向-物件串列化serialize(),__sleep(),__wakeup() 的程式碼詳解

黄舟
發布: 2023-03-07 06:20:01
原創
1799 人瀏覽過

  有時候需要把一個物件在網路上傳輸,為了方便傳輸,可以把整個物件轉換為二進位字串,等到達另一端時,再還原為原來的對象,這個過程稱之為串列化(也叫序列化)serialization, 就像我們現在想把一輛汽車透過輪船運到美國去,因為汽車的體積比較大,我們可以把汽車拆開成小的零件,然後我們把這些零件通過輪般運到美國去,到了美國再把這些零件組裝回汽車。
  通俗來說,序列化就是將一個變數所代表的「記憶體」數據,轉換為「字串」資料形式並持久保存在硬碟上的一種做法;而反序列化就是一個逆向的過程。
  有兩種情況我們必須把物件串列化,第一種情況就是把一個物件在網路中傳輸的時候要將物件串列化,第二種情況就是把物件寫入檔案或是資料庫的時候用到串行化。
  串行化有兩個過程,一個是串行化,就是把對象轉化為二進制的字串,我們使用serialize()函數來串行化一個對象,另一個是反串行化(也叫反序列化),就是把物件轉換的二進位字串再轉換為對象, 我們使用unserialize()函數來反串行化一個物件。
  PHP中serialize()函數的參數為物件名,傳回值為一個字串,Serialize()傳回的字串意義模糊,一般我們不會解析這個字串來得到物件的信息,我們只要把回傳來的這個字串傳到網路另一端或是儲存到檔案中即可。
  PHP中unserialize()函數來反串行化對象,這個函數的參數即為serialize()函數的回傳值,輸出當然是重新組織好的對象。
  
物件的序列化:

  1. #對一個物件進行序列化,只能將其屬性資料“保存起來”,而方法被忽略(方法不是資料)

  2. 物件在序列化時,會自動呼叫該物件所屬類別的魔術方法:sleep()

物件的反序列​​化:

  1. 對一個物件進行反序列化,其實就是恢復期原來保存起來的屬性數據,而且此時必然需要依賴該物件原本的所屬類別。

  2. 物件在反序列化的時候,會自動呼叫該物件所屬類別的魔術方法:wakeup()

全部串列化

1.serialize(物件名稱)

  將指定的類別物件串列化 $str=serialize($per)     //將per物件串列化,結果傳回$str
 
序列化做法:##

$v1 = 123; //这是一个变量,代表任意的内存数据$s1 = serialize( $v1 );  //将任何类型的变量数据,转换为“字符串”
file_put_contents( '要保存的目标文本文件', $s1 );    //将该字符串,保存到一个文件里(就是硬盘数据)
登入後複製

2.unserialize(串列化後的回傳值)

  反序列化,回傳結果是物件   $per=unserialize($str);

#反序列化做法:

$s1 = file_get_contens( '保存序列化数据的目标文本文件' );    //从一个文件里读出其中的所有字符
$v1 = unserialize($s1);   //将该字符串数据,反序列化转换为变量(数据)
登入後複製

序列化與反序列化的範例

<?phpclass Person{
    var $name;   
    var $sex;    
    var $age;    

    function construct($name = "", $sex = "", $age = "") {
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;
    }    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
}$p1 = new Person("张三", "男", 20);$p1_string = serialize($p1);    //把一个对象串行化,返一个字符串
echo $p1_string . "<br>";        
//串行化的字符串我们通常不去解析//将$p1_string存储到文件file.txt中file_put_contents(&#39;./file.txt&#39;, $p1_string);
$p2 = unserialize($p1_string);    //把一个串行化的字符串反串行化形成对象
$p2$p2->say();//下面的做法和上面效果一样
$p3_file = file_get_contents(&#39;./file.txt&#39;); //读取文件
$p3 = unserialize($p3_file); //反序列化
$p3->say();?>
登入後複製

上例輸出結果:

O:6:"Person":3:{s:4:"name";s:4:"张三";s:3:"sex";s:2:"男";s:3:"age";i:20;}我的名字叫:张三 性别:男 我的年龄是:20
登入後複製

局部串列化

1.sleep()

  串列化某對象的部分屬性。

2.wakeup()

  反串列化時,初始化(其實修改)物件內容

  在PHP5中有兩個魔術方法sleep()方法和wakeup()方法,在物件串列化的時候,會呼叫一個sleep()方法來完成一些睡前的事情;而在重新醒來,即由二進位串重新組成一個物件的時候,則會自動呼叫PHP的另一個函數wakeup(),做一些物件醒來就要做的動作。 sleep()函數不接受任何參數, 但傳回一個
陣列,其中包含需要串列化的屬性。末被包含的屬性將在串列化時被忽略,如果沒有sleep()方法,PHP將保存所有屬性。

<?class Person{

    var $name;   
    var $sex;    
    var $age;    

    function construct($name = "", $sex = "", $age = "") {
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;
    }    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }    //指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex
    function sleep() {
        $arr = array("name", "age"); // 此时,属性$sex将被删除!!!

        return($arr);
    }    //重新生成对象时,并重新赋值$age为40
    function wakeup() {
        $this->age = 40;
    }
}$p1 = new Person("张三", "男", 20);//把一个对象串行化,返一个字符串,调用了sleep()方法,忽略没在数组中的属性
$sex$p1_string = serialize($p1);
echo $p1_string . "<br>"; //串行化的字符串我们通常不去解析
$p2 = unserialize($p1_string); //反串行化形成对象$p2重新赋值
$age为40
$p2->say();?>
登入後複製

上例輸出為:

O:6:"Person":2:{s:4:"name";s:4:"张三";s:3:"age";i:20;}我的名字叫:张三 性别: 我的年龄是:40
登入後複製

以上是PHP物件導向-物件串列化serialize(),__sleep(),__wakeup() 的程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!