__sleep()与__wakeup()
字面上的意思很好玩,睡觉和起床。它们分别对应着serialize()和unserialize()方法,也便是序列化和反序列化时会触发这两个魔术方法。
这里须要把稳的是,__sleep()须要返回一个数组,而这个数组对应着类中的属性名。常日来说,它们可以在序列化提高行数据清理事情,或者反序列化提高行数据的预处理事情。比如序列化前关闭数据库连接或者反序列化前打开数据库连接。

publicfunction__sleep(){echo'===sleep==='.PHP_EOL;echo'调用serialize()时来找我,先睡一会的'.PHP_EOL;echo'===unset==='.PHP_EOL;return['a'];}publicfunction__wakeup(){echo'===wakeup==='.PHP_EOL;echo'调用unserialize()时来找我,起床吧'.PHP_EOL;echo'===wakeup==='.PHP_EOL;}
__toString()
顾名思义,这个方法通过返回一个字符串,实现工具的打印。如果没有实现这个方法,我们直策应用echo是无法打印工具的,会报错。当实现了这个魔术方法后,直策应用echo或者print等方法就可以进入这个魔术方法中,并打印出该方法中返回的内容。
publicfunction__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();
这时,就会进入这个魔术方法。那么有什么用呢?对付闭包以及反射来说,这个魔术方法有不可替代的浸染。将来我们会在别的文章中进行详细解释。
publicfunction__invoke(){echo'===invoke==='.PHP_EOL;echo'把类当方法利用时就进这里了'.PHP_EOL;echo'===invoke==='.PHP_EOL;}
__clone()
利用clone关键字进行工具的复制时,就会调用这个魔术方法。实在便是 原型模式 的实现。在原型模式的干系文章中我们再来详细解释。
publicfunction__clone(){echo'===clone==='.PHP_EOL;echo'复制类的时候我就发挥浸染了'.PHP_EOL;echo'===clone==='.PHP_EOL;}
__set_state()与__debugInfo()
真的是神奇的PHP语法,末了这两个魔术方法一个是用的下划线命名,一个是用的小驼峰。实在无力吐槽~~
这两个方法对应的是var_export()和var_dump()方法在利用时的调用。一样平常是在调试时利用,实在非常类似于__toString()方法。
publicstaticfunction__set_state($an_array){echo'===set_state==='.PHP_EOL;echo'利用var_export()的时候利用调用我哦'.PHP_EOL;echo'===set_state==='.PHP_EOL;$m=newPHPMagic();$m->var1=111;$m->var2=222;return$m;}publicfunction__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