上文中介绍了十分罕用并且也是面试时的热门魔术办法,而这篇文章中的所介绍的或者并不是那么罕用,但相对是加分项。当你能精确地说出这些办法及作用的时候,置信对方更能对你另眼相看。
__sleep()与__wakeup()
字面上的意思很好玩,睡觉和起床。它们别离对应着serialize()和unserialize()办法,也就是序列化和反序列化时会触发这两个魔术办法。
这里须要留神的是,__sleep()须要返回一个数组,而这个数组对应着类中的属性名。通常来说,它们能够在序列化前进行数据清理工作,或者反序列化前进行数据的预处理工作。比方序列化前敞开数据库连贯或者反序列化前关上数据库连贯。
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语法,最初这两个魔术办法一个是用的下划线命名,一个是用的小驼峰。切实有力吐槽~~
这两个办法对应的是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