魔术方法笔记

1.魔术方法 __set()   

触发时机:当外部设置 set()  对象中受保护或者私有属性时候调用

该方法两个参数:第一个参数就是受保护或者私有的属性成员名称,第二个参数对应的值

2.魔术方法__get()

触发时机:当外部调用  对象中受保护或者私有属性时候调用

该方法一个参数:参数就是受保护或者私有的属性成员名称

3.魔术方法 __unset() 

触发时机:当外部销毁unset()  对象中受保护或者私有属性时候调用

该方法一个参数:参数就是受保护或者私有的属性成员名称

4.魔术方法 __isset()

触发时机:外部isset() 判断  对象中受保护或者私有属性成员时候调用

该方法一个参数:参数就是受保护或者私有的属性成员名称

5.魔术方法 __construct()  构造函数

对象始化使用被调用

6.魔术方法 __destruct() 析构函数

对象被销毁时候被调用

 

<?php

class person
{
    public $name; //公共 
    protected $age;//受保护的 自身和子类可以调用
    private $mobile; //私有的 自设可以调用

    public function __unset($data){
        if($data=='age'){
            unset($this->age);
        }
    }
    
   public function __get($data){
        if($data=='age'){
            return $this->age;
        }
   }
    
    public function __set($data,$value){
        if($data=='age'){
            $this->age =$value;
        }
    }

    public function __iseet($data){
        if($data=='age'){
            return isset($data);
        }
    }
    
}

$person = new person();
unset($person->name); //可以注销
unset($erson->age); //不可注销  会触发魔术方法 __unset() 可以在魔术方法中做unset()操作


$person->name; //可以获取
$person->age; //不可以获取  会触发 __get() 


$person->name = 'Jack'; //可以设置
$person->age = '21'; //不可设置,  会触发魔术方法 __set()



isset($person->name);  //返回 false
$person->name = 'Jack'
isset($person->name); //发挥 true


isset($person->age);  //返回 false  应为无法访问 age属性所以永远都是false 除非利用 __isset() 触发在对象内部用 isset() 判断
$person->age = '21';
isset($person->age); // __isset() 被触发,在对象内部用 isset() 判断返回结果 true

7魔术方法 __toString() 

echo 一个对象时候被触发,该方法需要return 一个字符串

 

<?php

class person
{
    public $name; //公共 
    
    public function __toString(){
          return '如果没有写__toStrigin()方法,直接echo对象会报错';
    }
    
   
    
}

$person = new persion();
echo $person->name;

8.魔术方法 __debugInfo() 

var_dump 一个对象时候被触发,该方法需要return 一个数组

<?php

class person
{
    public $name; 
    public $age;
    
    public function __debugInfo(){
          return ['name'=>$this->name,'age'=>$this->age];
    }
    
   
    
}

$person = new persion();
var_dump($person);

9.魔术方法 __call() 

触发时机:当外部调用对象中不存在的方法时候,将会触发 __call()

该方法两个参数:参数1 方法名  参数二 给定的参数集合

<?php

class person
{
    public $name; 
    public $age;
    
    public function __call($name,$value){
          var_dump($value);
    }

    
   
    
}

$person = new persion();
$person->demo(1,2,3);//触发 __call 方法,否则会报错,  返回结果  [1,2,3]

 

10.魔术方法 __callStatic() 

触发时机:当外部调用对象中不存在的静态方法时候,将会触发 __callStatic()

该方法两个参数:参数1 方法名  参数二 给定的参数集合

 

11.魔术方法 __sleep() 

触发时机:序列化serialize() 一个对象的时候将触发  

返回值必须是一个数组,数组中写你想要序列化的成员属性名

<?php

class person
{
    public $name; 
    public $age;
    public $mobile;
    
    public function __sleep(){
          return ['name','age']; //指定返回的属性名  也可以是全部 
    }

    
   
    
}

$person = new persion();
$data = serialize($person);//触发 __sleep 方法 应用场景一般在当方法结束后想报保存对象中某些属性的时候应用到
file_put_content('demo.log',$data); // 实际保存到demo.log中的对象属性只有 name 和  age

12.魔术方法 __wakeup() 

触发时机:反序列化unserialize() 一个对象的时候将触发  

反序列化成功后,想要对对象执行一些初始化操作,可以写在这个函数中

13.魔术方法 __clone() 

触发时机:clone 一个对象的时候将触发  

要对克隆后属性做一些操作,可以在写该方法中

<?php

class person
{
    public $name; 
    public $age;
    public $mobile;
    
    public __constract($name,$age,$mobile){
        $this->name = $name;
        $this->age = $age;
        $this->mobile = $mobile;
    }
    public function __clone(){
          $this->age = '18';
    } 
}

$person = new persion('jack','20','1383838438');
$obj = clone $person; // 克隆对象时候触发 __clone()魔术方法
var_dump($obj); //打印结果 age 属性值是18 而不是20已经被 __clone() 方法重置为18了

14.魔术方法 __autoload()   唯一一个写在类外的魔术方法

触发时机:实例化一个类时候 ,当前脚本没有该类,将触发 

一个参数,实例化 类名称字符串

<?php

class person
{
    public $name; 
    public $age;
    public $mobile;
    
    public __constract($name,$age,$mobile){
        $this->name = $name;
        $this->age = $age;
        $this->mobile = $mobile;
    }
    public function demo(){
          
    } 
}

function __autoload($name){
    $file = $name.'.php';
    include $file;
}

$person = new order(); // order类不存在  将触发 __autoload()魔术方法 从而实现自动加载对应的类(只要这个类存在),通过__autoload() 引入文件

视屏教程:

https://www.bilibili.com/video/av14244096/

https://www.bilibili.com/video/av14245415/

https://www.bilibili.com/video/av14247154/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值