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

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.mrgr.cn/news/61102.html

相关文章:

  • SpringCloud系列教程:微服务的未来(十二)OpenFeign连接池、最佳实践、日志、微服务拆分
  • linux下的线程
  • 多个页面一张SQL表,前端放入type类型
  • Linux Top 命令 load average 指标解读
  • 服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found.
  • C++ ——— 内部类
  • SpringBoot框架下的商场应急处理流程
  • Python库numpy之七
  • 手机无线/有线投屏电脑方案
  • 新能源行业必会基础知识-----电力系统经济学原理-----主目录-----持续更新
  • win10 wsl2 install
  • 2024-10-29 商业分析-恒大数据超过50%造假-依然获得AAA评级-国内营商环境-诈骗为主-记录
  • jenkins自动化构建vue(web)项目并部署(项目实战)
  • 根据软件系统设计与建模的叙述开发一套煤矿建设项目安全预警系统
  • 新能源汽车爆炸频发?FLIR TG275助你提前检测,规避风险!
  • SpringBoot技术在商场应急管理中的创新应用
  • 在macOS的多任务处理环境中,如何平衡应用的性能与用户体验?这是否是一个复杂的优化问题?如何优化用户体验|多任务处理|用户体验|应用设计
  • ssm011线上旅行信息管理系统(论文+源码)_kaic
  • 【SQL Server】解决因使用 varchar 类型存储 Unicode 字符串导致的中文显示乱码问题
  • 全志平台移植camera senor时报I2C错误
  • TikTok发展成为非洲第二大社交电商平台,TikTok营销软件
  • 计算机组成原理之CISC和RISC的基本概念、CISC和RISC的主要区别是什么
  • 华为配置手工负载分担模式链路聚合实验
  • 111111
  • 【MySQL】 运维篇—备份与恢复:使用mysqldump进行数据库备份与恢复
  • 云生X易搭云 | 打造全流程透明化法务工作平台