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