簡單分析PHP中序列化用法介紹

序列化在我們學習php中都會有用到了對於序列化我們常用的函數有serialize和unserialize了,希望以下這篇文章能夠幫助到各位瞭解到PHP中序列化用法,具體如下:

簡單分析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";}' ;