学习PHP反序列化PHP反序列化基础知识
FLYFISH面向对象
PHP 的面向对象是一种编程范式,通过将数据和操作数据的方法封装成独立的单元(即类和对象),使代码更模块化、可重用且易于维护。核心概念包括:
- 封装(Encapsulation):隐藏内部实现细节,暴露必要接口。
- 继承(Inheritance):子类可以继承父类的属性和方法。
- 多态(Polymorphism):同一方法在不同对象中有不同实现。
类
类的结构
结构:定义类名、定义成员变量(属性)、定义成员函数(方法)
类的内容
创建一个类
1 2 3 4 5 6 7 8 9 10
| <?php class hero{ #定义类(类名) var $name; #//声明成员变量 var $sex; #var为一种修饰符 function FLY($var1){ #声明成员函数 echo $this->name; #使用预定义$this调用成员变量 echo $var1; # 成员函数传参$var1可直接调用 } } ?>
|
实例化和赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php class hero{ var $name; var $sex; function FLY($var1){ echo $this->name; echo $var1; } }
$a=new hero(); $a->name='FLYFISH'; $a->sex='Unknown'; $a->FLY('刚满十八岁~'); print_r($a); ?>
FLYFISH刚满十八岁~hero Object ( [name] => FLYFISH [sex] => Unknown )
|
类的修饰符
在类中直接声明的变量成为成员属性
可以在类中声明多个变量,即”对象”中可以有多个成员属性,每个变量都存储”对象”不同的属性信息
访问权限修饰符:对属性的定义
常用访问权限修饰符:
|
类的内部 |
类的子部 |
类的外部 |
public |
√ |
√ |
√ |
protected |
√ |
√ |
× |
private |
√ |
× |
× |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php class hero{ public $name='FLYFISH'; private $sex='Unknown'; protected $length='170'; function FLY($var1){ echo $this->name; echo $var1; } }
$a=new hero(); echo $a->name; echo $a->sex; echo $a->length;
?>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php class hero{ public $name='FLYFISH'; private $sex='Unknown'; protected $length='170'; function FLY($var1){ echo $this->name; echo $var1; } }
class heroson expends hero{ function test(){ echo $this->name; echo $this->sex; echo $this->length; } }
$a=new hero(); $b=new heroson(); echo $hero->name; echo $hero->test();
?>
|
序列化基础知识
序列化的作用
序列化是指将对象的状态信息(属性)转化为可以存储或传输的形式的过程
| 对象或数组 |
序列化 |
可存储可运输 |
| 对象 |
————> |
字符串 |
序列化之后的表达方式/格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php
$a=null; echo serialize($a);
$b=6; echo serialize($b);
$c=6.6; echo serialize($c);
$d=true(false); echo serialize($d)
$e='FLYFISH'; echo serialize($e)
$f=array("flyfish","18","6.66"); echo $f[0];
echo serialize($f);
?>
|
对象序列化
不能序列化类,可以序列化对象
不序列化成员函数,只序列化成员变量
公有变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php class hero{ public $name = 'FLYFISH'; function FLY($var1){ echo $this->name; echo $var1; } }
$a=new hero(); echo serialize($a);
?>
|
私有变量
private私有属性序列化时,在变量名前加%00类名%00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php class hero{ private $name = 'FLYFISH'; function FLY($var1){ echo $this->name; echo $var1; } }
$a=new hero(); echo serialize($a);
echo urlencode(serialize($a));
?>
|
受保护变量
protected受保护属性序列化时,在变量名前加%00*%00
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php class hero{ protected $name = 'FLYFISH'; function FLY($var1){ echo $this->name; echo $var1; } }
$a=new hero(); echo serialize($a);
?>
|
对象序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php highlight_file(__FILE__); class test{ var $pub='benben'; function jineng(){ echo $this->pub; } } class test2{ var $ben; function __construct(){ $this->ben=new test(); } } $a = new test2(); echo serialize($a); ?>
|
反序列化
特性
反序列化之后的内容为一个对象
反序列化生成的对象里的值,由反序列化中的值提供;与原有类预定义的值无关
反序列化不触发类的成员方法;需要调用方法后才能触发
作用
将序列化后的参数还原成实例化的对象

例题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php highlight_file(__FILE__); error_reporting(0); class test{ public $a = 'echo "this is test!!";'; public function displayVar() { eval($this->a); } }
$get = $_GET["benben"]; $b = unserialize($get); $b->displayVar() ;
?>
|
?benben=O:4:"test":1:{s:1:"a";s:13:"system("id");";};
获取id内容