PHP的那些魔术方法(二)

上文中介绍了非常常用并且也是面试时的热门魔术方法,而这篇文章中的所介绍的或许并不是那么常用,但绝对是加分项。当你能准确地说出这些方法及作用的时候,相信对方更能对你刮目相看。

__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

(0)

相关推荐

  • 彻底搞明白PHP中的include和require

    在PHP中,有两种包含外部文件的方式,分别是include和require.他们之间有什么不同呢? 如果文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序停止运行 ...

  • final关键字在PHP中的使用

    final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...

  • 在PHP中灵活使用foreach+list处理多维数组

    先抛出问题,有时候我们接收到的参数是多维数组,我们需要将他们转成普通的数组,比如: $arr = [ [1, 2, [3, 4]], [5, 6, [7, 8]],]; 我们需要的结果是元素1变成1, ...

  • [PHP小课堂]PHP中的那些魔术方法(二)

    [PHP小课堂]PHP中的那些魔术方法(二) 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 月经调理实用方法二:经期中1、材料:肉桂...

    月经调理实用方法二:经期中 1.材料:肉桂.吴茱萸.小茴香.研末用白酒炒热敷于肚脐部,冷了在炒在敷.连敷3天,下次月经前在敷3天.(也可煎水泡脚) 2.红枣.桂圆.生姜煮水10分钟打入鸡蛋煮熟 加入红 ...

  • 小儿按摩方法二

    按摩方法二 1.常用手法 (1)以两拇指指端,按压在患儿双侧三阴交穴上,先掐后揉1-3分钟. (2)点揉并弹拨绝骨穴1分钟. (3)患儿俯卧位,家长将两手掌面相对搓热,然后把两手置于患儿胁下,向下擦至 ...

  • 怎么在Excel中给不足位数的数字前面补0?方法二你肯定想不到

    嗨咯大家好,我是亮仔 在工作中经常会遇到需要对数字补齐位数的情况,比如图中所示,需要把员工的工号变成统一的8位数,不足的用0补足 在Excel中我们怎么实现呢,今天亮仔将分享2个方法 点击观看视频教程 ...

  • 『保健养生』中药补方: 民间的补血方法二十则

    补血方 血是人体最宝贵的物质之一,它内养脏腑,外濡皮毛筋骨,维持人体各脏腑组织器官的正常机能活动,使目能视.脚能步.掌能握.指能捏.神志清晰.精力充沛,这些都是血的功能.若血虚,不能营养人体,则面色无 ...

  • 『保健养生』中药补方: 民间的补血方法二

    鲜乌贼鱼肉250克,桃仁15,克,黄酒.酱油.白糖各适量.乌贼鱼肉冲洗干净,切条备用.桃仁洗净,去皮备用.乌贼鱼肉放入锅中,加桃仁.清水,旺火烧沸后加黄酒.酱油.白糖,再用小火煮至熟烂即成. 本方有养 ...

  • Excel通过全称匹配出简称!【方法二】

    通过简称查找匹配全称前面介绍过 那么如何全称查找匹配简称呢? 已知:地区对应邮政编码如下所示: 此表位于单元格的F:G列 地区 邮政编码 拱墅 310011 西湖 310013 滨江 310051 上 ...

  • 用PS消除抠图后杂边之方法二:还能平滑选区边缘!

    用PS消除抠图后杂边之方法二:还能平滑选区边缘!

  • PS抠出复杂树木强大有效的方法二!

    PS抠出复杂树木强大有效的方法二!