在PHP中,“__sleep()”是一個(gè)魔術(shù)方法,執(zhí)行serialize()時(shí),先會(huì)調(diào)用該方法;它可以用于清理對象,并返回一個(gè)包含對象中所有應(yīng)被序列化的變量名稱的數(shù)組?!癬_sleep()”方法常用于提交未提交的數(shù)據(jù),或類似的清理操作。
本教程操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦
PHP中__sleep()方法詳解
__sleep(),執(zhí)行serialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
serialize() 函數(shù)會(huì)檢查類中是否存在一個(gè)魔術(shù)方法 __sleep()。如果存在,則該方法會(huì)優(yōu)先被調(diào)用,然后才執(zhí)行序列化操作。
此功能可以用于清理對象,并返回一個(gè)包含對象中所有應(yīng)被序列化的變量名稱的數(shù)組。
如果該方法未返回任何內(nèi)容,則 NULL 被序列化,并產(chǎn)生一個(gè) E_NOTICE 級(jí)別的錯(cuò)誤。
注意:
__sleep() 不能返回父類的私有成員的名字。這樣做會(huì)產(chǎn)生一個(gè) E_NOTICE 級(jí)別的錯(cuò)誤??梢杂?Serializable 接口來替代。
作用:
__sleep() 方法常用于提交未提交的數(shù)據(jù),或類似的清理操作。同時(shí),如果有一些很大的對象,但不需要全部保存,這個(gè)功能就很好用。
【推薦學(xué)習(xí):《PHP視頻教程》】
具體請參考如下代碼:
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='男') { $this->name = $name; $this->age = $age; $this->sex = $sex; } /** * @return array */ public function __sleep() { echo "當(dāng)在類外部使用serialize()時(shí)會(huì)調(diào)用這里的__sleep()方法<br>"; $this->name = base64_encode($this->name); return array('name', 'age'); // 這里必須返回一個(gè)數(shù)值,里邊的元素表示返回的屬性名稱 } } $person = new Person('小明'); // 初始賦值 echo serialize($person); echo '<br/>';
代碼運(yùn)行結(jié)果:
當(dāng)在類外部使用serialize()時(shí)會(huì)調(diào)用這里的__sleep()方法 O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}
擴(kuò)展知識(shí):
魔術(shù)方法
在利用對PHP反序列化進(jìn)行利用時(shí),經(jīng)常需要通過反序列化中的魔術(shù)方法,檢查方法里有無敏感操作來進(jìn)行利用。
PHP 將所有以 __(兩個(gè)下劃線)開頭的類方法保留為魔術(shù)方法。
常見的魔術(shù)方法
__construct()//創(chuàng)建對象時(shí)觸發(fā)
__destruct() //對象被銷毀時(shí)觸發(fā)
__call() //在對象上下文中調(diào)用不可訪問的方法時(shí)觸發(fā)
__callStatic() //在靜態(tài)上下文中調(diào)用不可訪問的方法時(shí)觸發(fā)
__get() //用于從不可訪問的屬性讀取數(shù)據(jù)
__set() //用于將數(shù)據(jù)寫入不可訪問的屬性
__isset() //在不可訪問的屬性上調(diào)用isset()或empty()觸發(fā)
__unset() //在不可訪問的屬性上使用unset()時(shí)觸發(fā)
__invoke() //當(dāng)腳本嘗試將對象調(diào)用為函數(shù)時(shí)觸發(fā)
__sleep() //此功能可以用于清理對象,并返回一個(gè)包含對象中所有應(yīng)被序列化的變量名稱的數(shù)組。
__wakeup() //經(jīng)常用在反序列化操作中,例如重新建立數(shù)據(jù)庫連接,或執(zhí)行其它初始化操作。
php魔術(shù)方法官方文檔 :https://www.php.net/manual/zh/language.oop5.magic.php