当前位置: 首页 > article >正文

php反序列化常见魔术方法整理

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-CSDN博客

本文整理php反序列化中常见的魔术方法

当资料遇到查阅用

 总览

属性类型小插曲

public属性是公有属性,可以在类外被调用修改。

private属性是私有属性,只能在类中调用与修改。

各个魔术方法演示

__construct与__destruct

作用:

__construct类在实例化的时候就会执行

__destruct类在去实例化或者执行完毕后执行

小案例

<?php
class student{
    public $name;
    public $age;
    public function __construct($name){
        $this->name=$name;
        echo "类执行前会执行__construct\n";
    }
    public function __destruct(){
        echo "类结束之后会执行__destruct\n";
    }
}

$a=new student("张三");
echo $a->name,"\n";
?>

执行结果如下

 __sleep

作用:

当类对象执行序列化操作的时候就会执行这个方法

即,当对象执行serialize();时就会执行这个方法

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __sleep(){
        $this->name="张三";
        echo "当这个类被序列化时__sleep就会被执行\n";
    }

}

$a=new student();
echo $a->name,"\n";
serialize($a);
echo $a->name;
?>

结果如下

__wakeup

作用:

执行反序列化时执行这个方法

即,当对象执行unserialize();时就会执行这个方法

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __wakeup(){
        $this->name="张三";
        echo "当这个序列被反序列化时__wakeup就会被执行\n";
    }

}

$a=new student();
echo $a->name,"\n";
$b=serialize($a);
$c=unserialize("$b");
echo $c->name,"\n";
?>

结果如下

__invoke

作用:

当类对象被当做函数调用时就会调用

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __invoke(){
        echo "__invoke函数被执行";
        }

}

$a=new student();
$a();
?>

结果如下

__toString

作用:

当类对象被当做字符串处理的时候,就会执行这个函数。

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __toString(){
        echo "__toString被执行";
    }
}

$a=new student();
echo $a;
?>

结果演示

__call

作用:

调用某个方法时,方法存在就调用对应方法,方法不存在则调用__call

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __call($name,$parameter){
        echo "很明显木得$name 方法,以及$parameter 参数也没有,所以__CALL被调用了";
    }
}

$a=new student();
$a->hello();
?>

结果输出

__get

作用:

当读取一个属性时,属性存在读取属性,不存在则调用get函数

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __get($n){
        echo "没有$n 这个属性,所以执行了__get";
    }
}

$a=new student();
echo $a->aaa;
?>

结果如下

__set

作用:

当设置的属性不存在或者为私有属性的时候就会执行__set魔术方法

小案例

<?php
class student{
    public $name="初始值";
    public $age;
    public function __set($name,$value){
        echo "没有$name";
        echo "记录你设置的值为:$value";
    }
}

$a=new student();
echo $a->aaa=111;
?>

结果如下

__isset

作用:

当用isset或者empty检测私有属性,或者不存在的属性时就会执行这个东西

小案例

<?php
class student{
    public $name="初始值";
    private $age;
    public function __isset($name){
        echo "没有$name 或者为私有";
    }
}

$a=new student();
echo isset($a->b),"\n";
echo isset($a->age);
?>

结果如下

__unset

作用:

当调用unset销毁类属性时,类属性不存在或者私有时调用此方法。

小案例

<?php
class student{
    public $name="初始值";
    private $age;
    public function __unset($name){
        echo "没有$name 或者为私有";
    }
}

$a=new student();
unset($a->age);
?>

结果如下

上述魔术方法的常见反序列利用


http://www.kler.cn/a/375541.html

相关文章:

  • 实践KDTS-WEB从mysql迁移到kingbasev9
  • 由于这些关键原因,我总是手边有一台虚拟机
  • 【Rust自学】5.3. struct的方法(Method)
  • 《计算机组成及汇编语言原理》阅读笔记:p48-p81
  • C++---------随机库,standfor库
  • 「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
  • 硅谷甄选(三)登录注册
  • Cloud Native Spring in Action
  • 排序算法:从原理到 Java 实现
  • 【JavaGuide】十大经典排序算法总结
  • B站狂神说+mybatis增删改查操作
  • 提升网站安全性 HTTPS的重要性与应用指南
  • 后端:Spring、Spring Boot-实例化Bean依赖注入(DI)
  • 【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】
  • (10)文件操作
  • linux虚拟机上使用USB转串口工具
  • HTTP 全知道:请求与响应的深度剖析
  • Spring Boot JPA中的Page组件详解
  • 【时间之外】IT人求职和创业应知【23】
  • 【日常记录-Java】JarFile
  • Gorilla Mk1机器人:CubeMars电机加持,助力高空作业新突破
  • 3259. 超级饮料的最大强化能量
  • 【AI人工智能】给GPT一个英文文档,让它进行翻译,总结。
  • linux图形化X窗口
  • 商品详情API接口系列(json数据示例演示)
  • Lucene的使用方法与Luke工具(2)