|
上文中介紹了非常常用并且也是面試時(shí)的熱門魔術(shù)方法,而這篇文章中的所介紹的或許并不是那么常用,但絕對(duì)是加分項(xiàng)。當(dāng)你能準(zhǔn)確地說(shuō)出這些方法及作用的時(shí)候,相信對(duì)方更能對(duì)你刮目相看。
字面上的意思很好玩,睡覺(jué)和起床。它們分別對(duì)應(yīng)著serialize()和unserialize()方法,也就是序列化和反序列化時(shí)會(huì)觸發(fā)這兩個(gè)魔術(shù)方法。 這里需要注意的是,__sleep()需要返回一個(gè)數(shù)組,而這個(gè)數(shù)組對(duì)應(yīng)著類中的屬性名。通常來(lái)說(shuō),它們可以在序列化前進(jìn)行數(shù)據(jù)清理工作,或者反序列化前進(jìn)行數(shù)據(jù)的預(yù)處理工作。比如序列化前關(guān)閉數(shù)據(jù)庫(kù)連接或者反序列化前打開(kāi)數(shù)據(jù)庫(kù)連接。 public function __sleep()
顧名思義,這個(gè)方法通過(guò)返回一個(gè)字符串,實(shí)現(xiàn)對(duì)象的打印。如果沒(méi)有實(shí)現(xiàn)這個(gè)方法,我們直接使用echo是無(wú)法打印對(duì)象的,會(huì)報(bào)錯(cuò)。當(dāng)實(shí)現(xiàn)了這個(gè)魔術(shù)方法后,直接使用echo或者print等方法就可以進(jìn)入這個(gè)魔術(shù)方法中,并打印出該方法中返回的內(nèi)容。 public function __toString()當(dāng)然,它也能實(shí)現(xiàn)對(duì)象轉(zhuǎn)換到字符串,如在字符串拼接的時(shí)候,如:$obj = new Object(); $a = 'this is ' . $obj;這樣使用。
很有意思的一個(gè)魔術(shù)方法,它的作用是將對(duì)象當(dāng)做方法使用時(shí)會(huì)調(diào)用這個(gè)魔術(shù)方法。什么意思呢?比如:$obj = new Object();,然后直接$obj(); 這時(shí),就會(huì)進(jìn)入這個(gè)魔術(shù)方法。那么有什么用呢?對(duì)于閉包以及反射來(lái)說(shuō),這個(gè)魔術(shù)方法有不可替代的作用。將來(lái)我們會(huì)在別的文章中進(jìn)行詳細(xì)說(shuō)明。 public function __invoke()
使用clone關(guān)鍵字進(jìn)行對(duì)象的復(fù)制時(shí),就會(huì)調(diào)用這個(gè)魔術(shù)方法。其實(shí)就是原型模式的實(shí)現(xiàn)。在原型模式的相關(guān)文章中我們?cè)賮?lái)詳細(xì)說(shuō)明。 public function __clone()
真的是神奇的PHP語(yǔ)法,最后這兩個(gè)魔術(shù)方法一個(gè)是用的下劃線命名,一個(gè)是用的小駝峰。實(shí)在無(wú)力吐槽~~ 這兩個(gè)方法對(duì)應(yīng)的是var_export()和var_dump()方法在使用時(shí)的調(diào)用。一般是在調(diào)試時(shí)使用,其實(shí)非常類似于__toString()方法。 public static function __set_state($an_array)通過(guò)兩篇文章,我們熟悉了PHP所定義的這些魔術(shù)方法。在這里需要特別注意的是,PHP中將所有以__兩個(gè)下劃線開(kāi)頭的方法做為魔術(shù)方法的保留命名。所以在定義類方法的時(shí)候,不要使用兩個(gè)下劃線開(kāi)頭的方法名。 文檔參考:https://www./manual/zh/language.oop5.magic.php 完整代碼:https://github.com/zhangyue0503/php/blob/master/newblog/PHPMagic.php |
|
|
來(lái)自: 硬核項(xiàng)目經(jīng)理 > 《待分類》