先寫一段代碼
class myClass{ public $myContent; function outMycontent(){ //dosomething }}$content = new myClass();echo serialize($content);輸出的結果是O:7:”myClass”:1:{s:9:”myContent”;N;}
它竟然把一個類的給序列化了,也就是把一個類轉換成了一個字符串,可以傳輸或者保存下來。
下面我修改一下上面的代碼
class myClass{ public $myContent; function __construct($string){ $this->myContent = $string; }}$content = new myClass('my china');echo serialize($content);輸出的結果是O:7:”myClass”:1:{s:9:”myContent”;s:8:”my china”;}
序列化后也對應了相應的值,但是現在有個問題,比如我這個變量是個秘密呢?而且我又得把這個類序列化傳給別的地方呢? 看下面的代碼
class myClass{ public $myContent; function __construct($string){ $this->myContent = $string; }}$content = new myClass('我愛宋祖英,這是一個秘密');echo serialize($content);輸出的結果是O:7:”myClass”:1:{s:9:”myContent”;s:36:”我愛宋祖英,這是一個秘密”;}
我的秘密序列化后還是存在的,可是我不想我的心里話被別人看到。這個時候php很貼心,她知道你的問題,所以設置了魔術方法。
__sleep() 就表示當你執行serialize()這個序列化函數之前時的事情,就像一個回調函數,所以在這個回調函數里面我們就可以做點事情,來隱藏我的秘密。
class myClass{ public $myContent; function __construct($string){ $this->myContent = $string; } public function __sleep(){ $this->myContent = '這是我的秘密'; return array('myContent'); }}$content = new myClass('我愛宋祖英,這是一個秘密');echo serialize($content);輸出的結果是:O:7:”myClass”:1:{s:9:”myContent”;s:18:”這是我的秘密”;}
我的心里話被加密了,這個就是__sleep()的作用。至于__wakeup()和__sleep()大同小異,只不過是反序列化之前進行的回調函數。我不詳細說了,大家看下下面的代碼就明白了。
class myClass{ public $myContent; function __construct($string){ $this->myContent = $string; } public function __sleep(){ $this->myContent = '這是我的秘密'; return array('myContent'); } public function __wakeup(){ $this->myContent = '我的秘密又回來了'; //反序列化就不用返回數組了,就是對應的字符串的解密,字符串已經有了就不用其他的了 }}$content = new myClass('我愛宋祖英,這是一個秘密');PRint_r(unserialize(serialize($content)));輸出的內容為:myClass Object ( [myContent] => 我的秘密有回來了 )
新聞熱點
疑難解答
圖片精選