簡單分析PHP中序列化用法介紹
- 網頁設計
- 關注:8.21K次
序列化在我們學習php中都會有用到了對於序列化我們常用的函式有serialize和unserialize了,希望以下這篇文章能夠幫助到各位瞭解到PHP中序列化用法,具體如下:
0x00 序列化函式
serialize():返回帶有變數型別和值的字串
unserialize():想要將已序列化的字串變回 PHP 的值
測試程式碼:
<?php
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$a = $a;
$this->b = $b;
}
}
class test1 extends test{
function __construct($a){
$this->a = $a;
}
}
$a = 'hello';
$b = 123;
$c = false;
$d = new test('helloa','hellob','helloc');
$e = new test1('hello');
var_dump(serialize($a));
var_dump(serialize($b));
var_dump(serialize($c));
var_dump(serialize($d));
var_dump(serialize($e));
?>
執行結果:
string 's:5:"hello";' (length=12)
string 'i:123;' (length=6)
string 'b:0;' (length=4)
string 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' (length=46)
string 'O:5:"test1":2:{s:1:"a";s:5:"hello";s:1:"b";N;}' (length=46)
序列化字串格式: 變數型別:變數長度:變數內容 。
如果序列化的是一個物件,序列化字串格式為:
變數型別:類名長度:類名:屬性數量:{屬性型別:屬性名長度:屬性名;屬性值型別:屬性值長度:屬性值內容}
將上述結果反序列化輸出,執行結果:
string 'hello' (length=5)
int 123
boolean false
object(test)[1]
public 'a' => null
public 'b' => string 'hellob' (length=6)
object(test1)[1]
public 'a' => string 'hello' (length=5)
public 'b' => null
0x01 物件序列化
當序列化物件時,PHP 將在序列動作之前呼叫該物件的成員函式 sleep()。這樣就允許物件在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復物件時, 將呼叫 wakeup()成員函式。
在serialize()函式執行時,會先檢查類中是否定義了 sleep()函式,如果存在,則首先呼叫 sleep()函式,如果不存在,就保留序列字串中的所有屬性。
在unserialize()函式執行時,會先檢查是否定義了 wakeup()函式。如果 wakeup()存在,將執行__wakeup()函式,會使變數被重新賦值。
serialize()測試程式碼:
<?php
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$this->a = $a;
$this->b = $b;
}
function __sleep(){
echo "b has changed"."n";
$this->b = 'hib';
return $this->b;
}
function __wakeup(){
echo "a has changed"."n";
$this->a = 'hia';
}
}
class test1 extends test{
function __construct($a){
$this->a = $a;
}
}
$d = new test('helloa','hellob','helloc');
$e = new test1('hello');
serialize($d);
serialize($e);
var_dump($d);
var_dump($e);
?>
執行結果:
b has changed b has changed
object(test)[1]
public 'a' => string 'helloa' (length=6)
public 'b' => string 'hib' (length=3)
object(test1)[2]
public 'a' => string 'hello' (length=5)
public 'b' => string 'hib' (length=3)
unserialize()測試程式碼:
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$this->a = $a;
$this->b = $b;
}
function __sleep(){
echo "b has changed"."n";
$this->b = 'hib';
return $this->b;
}
function __wakeup(){
echo "a has changed"."n";
$this->a = 'hia';
}
}
class test1 extends test{
function __construct($a){
$this->a = $a;
}
}
$d = 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' ;
- 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/sjzz/sjzz/jvem5p.html