PHP常用的魔术方法记录下

本文详细介绍了PHP中的魔术方法,包括构造与析构方法、属性与方法的动态访问与调用、序列化与反序列化、对象克隆、转换与调用等。通过实例展示了这些方法如何工作,帮助读者深入理解并有效利用PHP的动态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前两天有面试的时候被问到了这个问题,当时脑子可能有点抽了,只是简单的提了几个,这次咱们就来简单的总结下PHP中的一些魔术方法,如果想知道魔术常量的一些内容,大家可以戳这里

首先就是__construct(构造方法),它是在构建对象的时被调用,之后就是__destruct(析构方法)明确销毁对象或脚本结束时被调用,所有的构造方法默认都是public的,如果修改成private,就会构成单例模式,咱们接下来就来看下具体的:

  1. __constuct构建对象的时被调用
  2. __destruct明确销毁对象或脚本结束时被调用
  3. __set当给不可访问或不存在属性赋值时被调用
  4. __get读取不可访问或不存在属性时被调用
  5. __isset对不可访问或不存在的属性调用isset()或empty()时被调用
  6. __unset对不可访问或不存在的属性进行unset时被调用
  7. __call调用不可访问或不存在的方法时被调用
  8. __callStatic调用不可访问或不存在的静态方法时被调用
  9. __sleep当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
  10. __wakeup当使用unserialize时被调用,可用于做些对象的初始化操作
  11. __clone进行对象clone时被调用,用来调整对象的克隆行为
  12. __toString当一个类被转换成字符串时被调用
  13. __invoke当以函数方式调用对象时被调用
  14. __set_state当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
  15. __debuginfo当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本

 

<?php
 
class Magic
{
    public $var = 'test';
 
    //构造函数,在创建对象的时候调用
    public function __construct()
    {
        echo '__construct called'.PHP_EOL;
    }
 
    //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用
    public function __destruct()
    {
        echo '__destruct called'.PHP_EOL;
    }
 
    //当给不可访问或不存在属性赋值时被调用
    public function __set($name, $value)
    {
        echo $name.'-'.$value;
        echo '__set called'.PHP_EOL;
    }
 
    //读取不可访问或不存在属性时被调用
    public function __get($name)
    {
        echo $name;
        echo '__get called'.PHP_EOL;
    }
 
    //调用不可访问或不存在的方法时被调用
    public function __call($name, $arguments)
    {
        echo $name . '-' . implode(',', $arguments);
        echo '__call called'.PHP_EOL;
    }
 
    //调用不可访问或不存在的静态方法时被调用
    public static function __callStatic($name, $arguments)
    {
        echo $name . '-' . implode(',', $arguments);
        echo '__callStatic called'.PHP_EOL;
    }
 
    //对不可访问或不存在的属性调用isset()或empty()时被调用
    public function __isset($name)
    {
        echo $name;
        echo '__isset called'.PHP_EOL;
        return true;
    }
 
    //对不可访问或不存在的属性进行unset时被调用
    public function __unset($name)
    {
        echo $name;
        echo '__unset called'.PHP_EOL;
    }
 
    //serialize时被调用,当你不需要保存大对象的所有数据时很有用
    public function __sleep()
    {
        echo '__sleep called'.PHP_EOL;
        return array('var1111111111');
    }
 
    //unserialize时被调用,可用于做些对象的初始化操作
    public function __wakeup()
    {
        echo '__wakeup called'.PHP_EOL;
        $this->var = 'test after wakeup';
    }
 
    //当一个类被转换成字符串时被调用
    public function __toString()
    {
        return '__toString called'.PHP_EOL;
    }
 
    //进行对象clone时被调用,用来调整对象的克隆行为
    public function __clone()
    {
        echo '__clone called'.PHP_EOL;
    }
 
    //当以函数方式调用对象时被调用
    public function __invoke()
    {
        echo '__invoke called'.PHP_EOL;
    }
 
    //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
    public static function __set_state($arr)
    {
        return  '__set_state called'.PHP_EOL;
    }
 
    //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
    public function __debuginfo($arr)
    {
        echo '__debuginfo called'.PHP_EOL;
        return array(
            'var' => 'test fro __debuginfo'
        );
    }
}
 
$m = new Magic(); //__construct()被调用
$m->not_exist_property = test; //__set()被调用
echo $m->not_exist_property;//__get()被调用
$m->abc(1,2,3); //__call()被调用
echo isset($m->not_exist_property); //__isset()被调用,返回bool值
unset($m->not_exist_property); //__unset()被调用
echo $tmp = serialize($m); //__sleep()被调用
unserialize($tmp); //__wakeup()被调用
$m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制
$m(); //__invoke()
eval( '$m2 = '  .  var_export ( $m ,  true ) .  ';' );var_dump($m2);
var_dump($m);
//最后__destruct()被调用
 
/*
结果:
__construct called
not_exist_property-test__set called
not_exist_property__get called
abc-1,2,3__call called
not_exist_property__isset called
1not_exist_property__unset called
__sleep called
O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called
__destruct called
__clone called
__invoke called
string(20) "__set_state called
"
class Magic#1 (1) {
  public $var =>
  string(4) "test"
}
__destruct called
__destruct called
 
 
*/

好啦,本次记录就到这里了。

如果感觉还不错的话,请多多点赞支持哦。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值