博途序列化指令?海玄隴2021-06-13 14:15:38

PHP的serialize是將變數序列化,返回一個具有變數型別和結構的字串表示式,而JSON則是一種更輕、更友好的用於介面(AJAX、REST等)資料交換的格式,兩者都是以一種字串的方式來體現一種資料結構。

1 用途

serialize主要用於php的序列化,儲存到檔案或者資料庫

json_encode 序列化,主要用於與其他語言互動,對於傳輸來說,json有許多優點。

2 內容

serialize序列化的字串包含額外的內容,這是值的型別和長度的編碼

json_encode 只包括key-value

serialize後的內容要大於json_encode後的內容長度

3 物件序列化

在進行 json_decode解碼時注意,如果是序列化的數值型陣列,那麼json_decode 可以還原為原來的陣列,但如果序列化的是關聯陣列(或者物件),那麼由於json_decode無法判斷是關聯陣列還是物件,所以json_decode會預設還原解析為stdclass的物件,如果加第二個引數true才解析為關聯陣列

4 物件方法

json_encode不能序列化物件的成員方法

serialize序列化之後,unserialize反序列化的資料,可以重新呼叫成員方法,但是json_decode不行,會報錯

5 __sleep 和 __wakeUp魔術方法

當一個物件被序列化,PHP會呼叫__sleep方法(如果存在的話,並且進行操作,比如對變數賦值)。 在反序列化一個物件後,PHP 會呼叫__wakeup方法。 這兩個方法都不接受引數。 __sleep方法必須返回一個數組,包含需要序列化的屬性。 PHP會拋棄其它屬性的值。 如果沒有__sleep方法,PHP將儲存所有屬性。

在程式執行前,serialize() 函式會首先檢查是否存在一個魔術方法 __sleep。如果存在,__sleep()方法會先被呼叫, 然後才執行序列化(序列化)操作。這個功能可以用於清理物件,並返回一個包含物件中所有變數名稱的陣列(必須返回。與之相反,unserialize()會檢查是否存在一個__wakeup方法。如果存在,則會先呼叫 __wakeup方法,例如可以用於資料庫的重新連線。

6 Demo測試

Class Foo {

private $name;

public function test(){

return ‘test’;

}

}

$foo = new Foo();

$cser = serialize($foo);

$uncser = unserialize($cser);

$json = json_encode($foo);

$unjson = json_decode($json);

echo $uncser->test();

echo $unjson->test();

輸出:

test

PHP Fatal error: Call to undefined method stdClass::test() in /tmp/php/serialize。php on line 33