PHP 序列化和反序列化函數(shù)實例詳解
序列化與反序列化
把復雜的數(shù)據(jù)類型壓縮到一個字符串中
serialize() 把變量和它們的值編碼成文本形式
unserialize() 恢復原先變量
1.創(chuàng)建一個$arr數(shù)組用于儲存用戶基本信息,并在瀏覽器中輸出查看結(jié)果;
$arr=array(); $arr['name']='張三'; $arr['age']='22'; $arr['sex']='男'; $arr['phone']='123456789'; $arr['address']='上海市浦東新區(qū)'; var_dump($arr);
輸出結(jié)果:
array(5) { ["name"]=> string(6) "張三" ["age"]=> string(2) "22" ["sex"]=> string(3) "男" ["phone"]=> string(9) "123456789" ["address"]=> string(21) "上海市浦東新區(qū)" }
2.將$arr數(shù)組進行序列化賦值給$info字符串,并在瀏覽器中輸出查看結(jié)果;
$info=serialize($arr); var_dump($info);
輸出結(jié)果:
string(140) "a:5:{s:4:"name";s:6:"張三";s:3:"age";s:2:"22";s:3:"sex";s:3:"男";s:5:"phone";s:9:"123456789";s:7:"address";s:21:"上海市浦東新區(qū)";}"
使用序列化serialize($arr)函數(shù),將數(shù)組中元素的鍵和值按照規(guī)則順序連接成字符串。a:5標志序列化為array包含5個鍵值對,s:4標志內(nèi)容為字符串包含4個字符。
通過序列化我們可以將一些模塊化的數(shù)據(jù)使用字符串的形式存儲在數(shù)據(jù)庫或session等,可以減少創(chuàng)建眾多繁瑣的數(shù)據(jù)表字段,當然序列化為字符串存儲會增加額外的空間,應合理的設計和應用。
3.最后使用unserialize($info)反序列化將字符串還原成我們需要的數(shù)組模式;
$zhangsan=unserialize($info); var_dump($zhangsan);
輸出結(jié)果:
array(5) { ["name"]=> string(6) "張三" ["age"]=> string(2) "22" ["sex"]=> string(3) "男" ["phone"]=> string(9) "123456789" ["address"]=> string(21) "上海市浦東新區(qū)" }
PHP序列化反序列化serialize和unserialize函數(shù)
昨天網(wǎng)上看到一道面試題,如下:
“類的屬性可以序列化后保存到session中,從而以后可以恢復整個類,這要用到的函數(shù)是?”
我記得原來老師說過序列化函數(shù)是"serialize",查了下,果不其然,今天記錄下,免得忘記。
<?php class aa{ public $a = 1; private $b = 2; protected $c = 3; function afun(){ return $this->a; } function bfun(){ return $this->b; } function __destruct(){ echo "變量銷毀了"; } } $v = new aa; echo $v->afun(); $se = serialize($v); unset($v); //這里先銷毀$v,這個時候會自動調(diào)用析構(gòu)函數(shù) echo "<hr />"; $v = unserialize($se); //再反序列化 echo $v->bfun();
看看運行結(jié)果
如果覺得還不明顯, 好,我們在改一下代碼
aa.class.php
<?php class aa{ public $a = 1; private $b = 2; protected $c = 3; function afun(){ return '$a的值是:'.$this->a; } function bfun(){ return '$b的值是:'.$this->b; } }
a1.php
<?php require './demo8.php'; Session_start(); $v = new aa(); $_SESSION['v'] = serialize($v);
a2.php
<?php require './demo8.php'; Session_start(); $v = unserialize($_SESSION['v']); echo $v->bfun();
再看看結(jié)果是不是一目了然了呢,好了,試驗做完了,結(jié)論調(diào)用下公論。
例子中的對象我們還可以換為數(shù)組等其他類型,效果都是一樣的!
其實serialize()就是將PHP中的變量如對象(object),數(shù)組(array)等等的值序列化為字符串后存儲起來.序列化的字符串我們可以存儲在其他地方如數(shù)據(jù)庫、Session、Cookie等,序列化的操作并不會丟失這些值的類型和結(jié)構(gòu)。這樣這些變量的數(shù)據(jù)就可以在PHP頁面、甚至是不同PHP程序間傳遞了。
而unserialize()就是把序列化的字符串轉(zhuǎn)換回PHP的值。
這里再引用一段PHP手冊上的說明,看了上面的例子,應該很容易明白下面這些話的意思了
想要將已序列化的字符串變回 PHP 的值,可使用 unserialize()。serialize() 可處理除了 resource 之外的任何類型。甚至可以 serialize() 那些包含了指向其自身引用的數(shù)組。你正 serialize() 的數(shù)組/對象中的引用也將被存儲。
當序列化對象時,PHP 將試圖在序列動作之前調(diào)用該對象的成員函數(shù) __sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調(diào)用 __wakeup() 成員函數(shù)
unserialize() 對單一的已序列化的變量進行操作,將其轉(zhuǎn)換回 PHP 的值。返回的是轉(zhuǎn)換之后的值,可為 integer、float、string、array 或 object。如果傳遞的字符串不可解序列化,則返回 FALSE。
以上所述是小編給大家介紹的PHP 序列化和反序列化函數(shù)實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
使用VS?Code+phpstudy實現(xiàn)PHP環(huán)境配置指南
這篇文章主要給大家介紹了關(guān)于使用VS?Code+phpstudy實現(xiàn)PHP環(huán)境配置的相關(guān)資料,對于初學者可以使用集成開發(fā)環(huán)境PHPStudy來配置PHP環(huán)境,需要的朋友可以參考下2023-07-07詳解Laravel5.6通過路由進行API版本控制的簡單方法
這篇文章主要介紹了詳解Laravel5.6通過路由進行API版本控制的簡單方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01Zend Framework框架的數(shù)據(jù)庫追蹤器使用示例
這篇文章主要介紹了Zend Framework框架的數(shù)據(jù)庫追蹤器使用示例,現(xiàn)把追蹤器的使用方法分享給大家,需要的朋友可以參考下2014-03-03一張表搞清楚php is_null、empty、isset的區(qū)別
這篇文章主要介紹了一張表搞清楚php is_null、empty、isset的區(qū)別,isset 判斷變量是否已存在,empty 判斷變量是否為空或為0,is_null 判斷變量是否為NULL,需要的朋友可以參考下2015-07-07php 數(shù)組處理函數(shù)extract詳解及實例代碼
php extract 函數(shù)使用數(shù)組鍵名作為變量名,使用數(shù)組鍵值作為變量值, 本函數(shù)可以處理表單提交并插入數(shù)據(jù)庫。文章向大家講解extract函數(shù)的基本使用方法及實例,需要的朋友可以參考下2016-11-11PHP中set error handler函數(shù)用法小結(jié)
set_error_handler() 函數(shù)設置用戶自定義的錯誤處理函數(shù)。該函數(shù)用于創(chuàng)建運行時期間的用戶自己的錯誤處理方法。該函數(shù)會返回舊的錯誤處理程序,若失敗,則返回 null2015-11-11