PHP的那些魔術方法(二)

上文中介紹了很是經常使用而且也是面試時的熱門魔術方法,而這篇文章中的所介紹的或許並非那麼經常使用,但絕對是加分項。當你能準確地說出這些方法及做用的時候,相信對方更能對你另眼相看。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

完整代碼:https://github.com/zhangyue0503/php/blob/master/newblog/PHPMagic.php

關注公衆號:【硬核項目經理】獲取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料

知乎、公衆號、抖音、頭條搜索【硬核項目經理】

B站ID:482780532

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息