当前位置: 首页 > 后端技术 > PHP

PHP的那些魔术(二)

时间:2023-03-29 23:39:30 PHP

上面说的是面试时非常常用和流行的魔术,本文介绍的可能不是那么常用,但绝对是加分项。当你能准确描述这些方法和功能时,相信对方会对你印象更深刻。__sleep()和__wakeup()字面意思是好玩,睡觉和醒来。它们分别对应serialize()和unserialize()方法,即序列化和反序列化时触发这两个魔术方法。这里要注意__sleep()需要返回一个数组,这个数组对应类中的属性名。一般来说,他们可以在序列化之前进行数据清洗,或者在反序列化之前进行数据预处理。比如在序列化之前关闭数据库连接或者在反序列化之前打开数据库连接。公共函数__sleep(){echo'===sleep==='.PHP_EOL;echo'调用serialize()时来找我,睡会儿'.PHP_EOL;回声'===未设置==='。PHP_EOL;return['a'];}publicfunction__wakeup(){echo'===wakeup==='.PHP_EOL;echo'调用unserialize()时来找我,起床'.PHP_EOL;echo'===wakeup==='.PHP_EOL;}__toString()顾名思义,该方法通过返回一个字符串来实现对象的打印。如果不实现这个方法,我们就不能直接使用echo打印对象,会报错。实现这个魔术方法后,可以直接使用echo或print等方法进入这个魔术方法,打印出这个方法返回的内容。公共函数__toString(){echo'===toString==='。PHP_EOL;echo'我将在调用echo和print时使用'.PHP_EOL;回声'===toString==='。PHP_EOL;return'printoutLet'stakealook';}当然也可以把对象转成字符串,比如字符串拼接的时候,比如:$obj=newObject();$a='这是'.$对象;以这种方式使用。__invoke()是一个非常有趣的魔术方法。它的作用是在对象作为方法时调用这个魔术方法。这意味着什么?例如:$obj=newObject();,则直接$obj();这个时候,就会进入这个法术。那有什么用呢?对于闭包和反射,这个神奇的方法有着不可替代的作用。我们将在以后的其他文章中详细介绍。公共函数__invoke(){echo'===invoke==='.PHP_EOL;echo'当使用一个类作为方法时,在这里输入'.PHP_EOL;echo'===invoke==='.PHP_EOL;}__clone()这个魔术方法在使用clone关键字复制一个对象时被调用。其实就是原型模式的实现。在原型模式的相关文章中,我们会详细讲解。公共函数__clone(){echo'===clone==='.PHP_EOL;echo'我在抄课时工作'.PHP_EOL;回声'===克隆==='。PHP_EOL;}__set_state()和__debugInfo()是非常神奇的PHP语法。最后两个魔术方法,一个用下划线命名,一个用小骆驼命名。实在是吐槽不出来~~这两个方法对应var_export()和var_dump()方法在使用时的调用。一般在调试时使用,其实和__toString()方法很相似。公共静态函数__set_state($an_array){echo'===set_state==='.PHP_EOL;echo'使用var_export()时给我打电话'。PHP_EOL;echo'===set_state==='.PHP_EOL;$m=新的PHPMagic();$m->var1=111;$m->var2=222;返回$m;}公共函数__debugInfo(){echo'===debugInfo==='。PHP_EOL;echo'当我使用var_dump()时是我'。PHP_EOL;回声'===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