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);
?>
结果如下