博途序列化指令?
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