小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PHP的那些魔術(shù)方法(二)

 硬核項(xiàng)目經(jīng)理 2021-05-31

上文中介紹了非常常用并且也是面試時(shí)的熱門魔術(shù)方法,而這篇文章中的所介紹的或許并不是那么常用,但絕對(duì)是加分項(xiàng)。當(dāng)你能準(zhǔn)確地說(shuō)出這些方法及作用的時(shí)候,相信對(duì)方更能對(duì)你刮目相看。

__sleep()與__wakeup()

字面上的意思很好玩,睡覺(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()
{
echo '===sleep===' . PHP_EOL;
echo '調(diào)用serialize()時(shí)來(lái)找我,先睡一會(huì)的' . PHP_EOL;
echo '===unset===' . PHP_EOL;
return ['a'];
}

public function __wakeup()
{
echo '===wakeup===' . PHP_EOL;
echo '調(diào)用unserialize()時(shí)來(lái)找我,起床吧' . PHP_EOL;
echo '===wakeup===' . PHP_EOL;
}

__toString()

顧名思義,這個(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()
{
echo '===toString===' . PHP_EOL;
echo '調(diào)用echo、print時(shí)會(huì)使用我' . PHP_EOL;
echo '===toString===' . PHP_EOL;
return '打印出來(lái)看看吧';
}

當(dāng)然,它也能實(shí)現(xiàn)對(duì)象轉(zhuǎn)換到字符串,如在字符串拼接的時(shí)候,如:$obj = new Object(); $a = 'this is ' . $obj;這樣使用。

__invoke()

很有意思的一個(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()
{
echo '===invoke===' . PHP_EOL;
echo '把類當(dāng)方法使用時(shí)就進(jìn)這里了' . PHP_EOL;
echo '===invoke===' . PHP_EOL;
}

__clone()

使用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()
{
echo '===clone===' . PHP_EOL;
echo '復(fù)制類的時(shí)候我就發(fā)揮作用了' . PHP_EOL;
echo '===clone===' . PHP_EOL;
}

__set_state()與__debugInfo()

真的是神奇的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)
{
echo '===set_state===' . PHP_EOL;
echo '使用var_export()的時(shí)候使用調(diào)用我哦' . 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()的時(shí)候就是我來(lái)啦' . PHP_EOL;
echo '===debugInfo===' . PHP_EOL;
return [
'var1' => $this->var1,
'var2' => $this->var2,
];
}

通過(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

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章