PHP序列化、反序列化常用的魔术方法
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发
特别好的简单案例:
<?php
//初始化一个类
class User{
//类的成员属性
private $name;
private $age;
private $sex;
//构造函数
function __construct($pname,$page,$psex){
$this->name=$pname;
$this->age=$page;
$this->sex=$psex;
}
//设置魔术方法__sleep()
/*
功能:返回一个数组,选择是全部序列化还是部分成员属性序列化,如果没有该函数就表示全部序列化
在序列化的时候自动调用这个方法
*/
function __sleep(){
return array('name'); //返回一个只序列化name属性的数组
}
function __wakeup(){
$this->name='Yue';
//$this->age=23;
}
}//the end of the class
$u=new User('Androidyue',22,'Man');//实例化一个对象
//file_put_contents('notepad1.txt',serialize($u));//序列化$u对象并且将信息存放在notepad1.txt文件中
//获取序列化的文件信息
$str=file_get_contents('notepad1.txt');
//对文件进行反序列化
$uu=unserialize($str);
//输出对象的信息
var_dump($uu);//结果:object(User)#2 (3) { ["name:private"]=> string(3) "Yue" ["age:private"]=> NULL ["sex:private"]=> NULL }
?>
1.__construct()
类一执行就开始调用,其作用是拿来初始化一些值。
2.__desctruct()
类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制。
3.__get()
方法用于获取私有属性值。(在设置私有属性的时候将会自动调用)【http://www.cnblogs.com/xishaonian/p/6170459.html】
4.__set()
在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法)【http://www.cnblogs.com/xishaonian/p/6170459.html】
5.__isset()
方法用于检测私有属性值是否被设定。(当外部使用isset读类内部进行检测对象是否有具有某个私有成员的时候就会被自动调用!)【http://www.cnblogs.com/xishaonian/p/6170459.html】
6.__unset()
方法用于删除私有属性。(在外部调用类内部的私有成员的时候就会自动的调用__unset魔术方法)【http://www.cnblogs.com/xishaonian/p/6170459.html】
7.__toString()
在对象当做字符串的时候会被调用。
<?php class TestClass
{
// 一个变量
public $variable = 'This is a string';
// 一个简单的方法
public function PrintVariable()
{
echo $this->variable . '<br />';
}
// Constructor
public function __construct()
{
echo '__construct <br />';
}
// Destructor
public function __destruct()
{
echo '__destruct <br />';
}
// Call
public function __toString()
{
return '__toString<br />';
}
}
// 创建一个对象
// __construct会被调用
$object = new TestClass();
// 创建一个方法
$object->PrintVariable();
// 对象被当作一个字符串
// __toString会被调用
echo $object;
// End of PHP script
// 脚本结束__destruct会被调用
?>
输出效果如下:
__construct
This is a string
__toString
__destruct
8.__sleep()
在对象被序列化的过程中自动调用。sleep要加数组
<?php
class test
{
public $username;
function admin()
{
print "_this is admin function<br/>";
}
function __sleep()
{
print "this is __sleep function";
}
}
$a = new test();
$a ->admin();
echo @serialize($a);
?>
输出效果:
_this is admin function
this is __sleep functionN;
9.___call() 当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息
10.__wakeup()函数 该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作
11.
PHP序列化、反序列化常用的魔术方法的更多相关文章
- php面向对象类中常用的魔术方法
php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct( ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- php反序列化漏洞绕过魔术方法 __wakeup
0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字 ...
- PHP中常用的魔术方法
我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(), ...
- php常用的魔术方法
__construct:构造函数,一旦创建对象都就会自动调用 __call:当调用了未定义的方法时会自动触发 __set:当给类外部不可访问的属性设置值时会自动触发 __get:当获取类外部不可访问的 ...
- php中的重载以及几个常用的魔术方法示例
在面向对象语言中,有一个很重要的概念——overload,即重载.所谓重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同.但是,在php中,这个概念跟大多面向对象语言中的“ ...
- PHP常用的魔术方法及规则
1. __construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行.2. __desstruct 对象的所有引用都被删除或者当对象被显式销毁时执行.3.__call()在对 ...
- XML序列化反序列化—常用类
public class XMLSerializer { #region (public) xml序列化 /// <summary> /// ...
- PHP面向对象中常用的关键字和魔术方法
PHP面向对象中常用的关键字 final 1.final不能修饰成员属性(类中常量不是用这个关键字) 2.final只能修饰类和方法 作用: 使用fi ...
随机推荐
- cacti安装spine 解决WARNING: Result from CMD not valid. Partial Result: U错误
安装spine用来替换cacti原本的执行方式,需要的包在附件中,请注意spine的安装包和你安装的cacti版本不用相同,最好是最新的spine 1.安装gcc #yum install -y gc ...
- Thread.Sleep(0)
理解Thread.Sleep函数 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4- ...
- div、span绑定内容改变事件
内容改变事件onchange只适用于form表单标签(input.select.textarea) 当需要对div.span标签进行内容改变监听则无法适用,查阅了一些资料发现jquery有针对的方法, ...
- 网页添加提示音,用setInterval
如果一条数据通过审核了,修改数据库中一个值,用户怎么异步动态知道自己的记录通过审核了呢,我是通过音乐和提示的方式. 网页中添加如下代码: <style> #notify { positio ...
- hdu2295-Radar
有n个城市,\(m\)个雷达,\(k\)个操作员,每个操作员只能操作一个雷达.每个雷达的覆盖范围是一个以雷达坐标为中心的圆,所有雷达的覆盖半径是相同的. 现在给出这\(n\)个城市,\(m\)个雷达的 ...
- BZOJ 1022 小约翰的游戏(anti-sg)
这是个anti-sg问题,套用sj定理即可解. SJ定理 对于任意一个Anti-SG游戏,如果定义所有子游戏的SG值为0时游戏结束,先手必胜的条件: 1.游戏的SG值为0且所有子游戏SG值均不超过1. ...
- 【bzoj1858】[Scoi2010]序列操作 线段树区间合并
题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b ...
- 【bzoj1609】[Usaco2008 Feb]Eating Together麻烦的聚餐 dp
题目描述 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2批 ...
- [洛谷P3979]遥远的国度
题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...
- BZOJ3140:[HNOI2013]消毒——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 https://www.luogu.org/problemnew/show/P3231 最近在 ...