当前位置: 首页 > 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

相关文章:

  • 基于 webpack 项目接入 vite 你可能需要注意的点
  • 12. 线性规划的单纯形法
  • vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发
  • spring boot工程集成jwt 鉴权步骤
  • 期权懂|开通ETF股票期权需要什么条件?ETF股票期权佣金是多少?
  • 第八届御网杯线下赛Pwn方向题解
  • 硅谷甄选(三)登录注册
  • 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)