上文中介紹了很是經常使用而且也是面試時的熱門魔術方法,而這篇文章中的所介紹的或許並非那麼經常使用,但絕對是加分項。當你能準確地說出這些方法及做用的時候,相信對方更能對你另眼相看。php
__sleep()與__wakeup()
字面上的意思很好玩,睡覺和起牀。它們分別對應着serialize()和unserialize()方法,也就是序列化和反序列化時會觸發這兩個魔術方法。git
這裏須要注意的是,__sleep()須要返回一個數組,而這個數組對應着類中的屬性名。一般來講,它們能夠在序列化前進行數據清理工做,或者反序列化前進行數據的預處理工做。好比序列化前關閉數據庫鏈接或者反序列化前打開數據庫鏈接。github
public function __sleep() { echo '===sleep===' . PHP_EOL; echo '調用serialize()時來找我,先睡一會的' . PHP_EOL; echo '===unset===' . PHP_EOL; return ['a']; } public function __wakeup() { echo '===wakeup===' . PHP_EOL; echo '調用unserialize()時來找我,起牀吧' . PHP_EOL; echo '===wakeup===' . PHP_EOL; }
__toString()
顧名思義,這個方法經過返回一個字符串,實現對象的打印。若是沒有實現這個方法,咱們直接使用echo是沒法打印對象的,會報錯。當實現了這個魔術方法後,直接使用echo或者print等方法就能夠進入這個魔術方法中,並打印出該方法中返回的內容。面試
public function __toString() { echo '===toString===' . PHP_EOL; echo '調用echo、print時會使用我' . PHP_EOL; echo '===toString===' . PHP_EOL; return '打印出來看看吧'; }
固然,它也能實現對象轉換到字符串,如在字符串拼接的時候,如:$obj = new Object(); $a = 'this is ' . $obj;這樣使用。數據庫
__invoke()
頗有意思的一個魔術方法,它的做用是將對象當作方法使用時會調用這個魔術方法。什麼意思呢?好比:$obj = new Object();,而後直接$obj();數組
這時,就會進入這個魔術方法。那麼有什麼用呢?對於閉包以及反射來講,這個魔術方法有不可替代的做用。未來咱們會在別的文章中進行詳細說明。微信
public function __invoke() { echo '===invoke===' . PHP_EOL; echo '把類當方法使用時就進這裏了' . PHP_EOL; echo '===invoke===' . PHP_EOL; }
__clone()
使用clone關鍵字進行對象的複製時,就會調用這個魔術方法。其實就是原型模式的實現。在原型模式的相關文章中咱們再來詳細說明。閉包
public function __clone() { echo '===clone===' . PHP_EOL; echo '複製類的時候我就發揮做用了' . PHP_EOL; echo '===clone===' . PHP_EOL; }
__set_state()與__debugInfo()
真的是神奇的PHP語法,最後這兩個魔術方法一個是用的下劃線命名,一個是用的小駝峯。實在無力吐槽~~oop
這兩個方法對應的是var_export()和var_dump()方法在使用時的調用。通常是在調試時使用,其實很是相似於__toString()方法。學習
public static function __set_state($an_array) { echo '===set_state===' . PHP_EOL; echo '使用var_export()的時候使用調用我哦' . PHP_EOL; echo '===set_state===' . PHP_EOL; $m = new PHPMagic(); $m->var1 = 111; $m->var2 = 222; return $m; } public function __debugInfo() { echo '===debugInfo===' . PHP_EOL; echo '使用var_dump()的時候就是我來啦' . PHP_EOL; echo '===debugInfo===' . PHP_EOL; return [ 'var1' => $this->var1, 'var2' => $this->var2, ]; }
經過兩篇文章,咱們熟悉了PHP所定義的這些魔術方法。在這裏須要特別注意的是,PHP中將全部以__兩個下劃線開頭的方法作爲魔術方法的保留命名。因此在定義類方法的時候,不要使用兩個下劃線開頭的方法名。
文檔參考:https://www.php.net/manual/zh/language.oop5.magic.php
關注公衆號:【硬核項目經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料
知乎、公衆號、抖音、頭條搜索【硬核項目經理】
B站ID:482780532