php类知识---最疯狂的魔术方法serialize,_sleep,__wakeup,unserialize,__autoload,__clone
- serialize-----把实例化的对象写入文件
- __sleep 调用serialize时触发
<?php class mycoach
{
public function __construct($name,$age,$expertin=[]){ $this->name = $name;
$this->age = $age;
$this->expertin=[];
$this->expertin=$expertin;
} public function __sleep()
{
return ['name','age','expertin'];
}
} $cpc = new mycoach('陈培昌',,['散打','泰拳', '巴西柔术']);
$srobj = serialize($cpc);
file_put_contents('cpcssecret.txt',$srobj);
?> 关键要点:
----类内部实现的 __sleep()要返回数组数据结构,元素都来自类的属性,以此达到控制哪些类可以写入文件
----serialize方法以对象为参数,返回值就是要写入文件的数据。
生成的文件中记录的对象形如:
O:7:"mycoach":3:{s:4:"name";s:9:"陈培昌";s:3:"age";i:22;s:8:"expertin";a:3:{i:0;s:6:"散打";i:1;s:6:"泰拳";i:2;s:12:"巴西柔术";}}
- unserialize-----把文件中的记录还原为类的实例对象
- __wakeup------执行unserialize时调用,用于执行一些初始化操作
<?php class mycoach
{
public function __construct($name,$age,$expertin=[]){ $this->name = $name;
$this->age = $age;
$this->expertin=[];
$this->expertin=$expertin;
} public function __sleep()
{
return ['name','age','expertin'];
} public function __wakeup()
{
#用途:还原对象(反序列化)的时候,执行一些初始化操作
echo "还原为对象"."\n"; }
} $objdate = file_get_contents('cpcssecret.txt');
var_dump(unserialize($objdate));
?> 输出结果:
还原为对象
object(mycoach)#1 (3) {
["name"]=>
string(9) "陈培昌"
["age"]=>
int(22)
["expertin"]=>
array(3) {
[0]=>
string(6) "散打"
[1]=>
string(6) "泰拳"
[2]=>
string(12) "巴西柔术"
}
}
- clone复制对象属性
- __clone可以限制哪些属性可以复制,哪些属性采用自定义
<?php class bt
{
protected $master = "徐晓冬";
private $age;
public function __construct($name,$srcfrom)
{
echo "欢迎来到必图拳馆,我是徐晓冬";
$this->name = $name;
//$this->age = $age;
$this->srcfrom = $srcfrom;
}
public function __get($master)
{
return $this->$master;
} public function __set($key,$value)
{
$this->$key = $value;
} public function self_introduce()
{
echo "大家好,我是 ".$this->name. " 今年芳龄 ". $this->age." 来自 ". $this->srcfrom." 我师父是 ".$this->master."\n";
} public function __clone()
{
$this->name = '丁大锅';
$this->age = ;
$this->srcfrom = '维基泄密';
} } /*$zilong = new bt('吴紫龙',21,'公安大学','徐晓冬');*/
$zilong = new bt('紫龙','公安大学');
$zilong->age=;
$zilong->self_introduce(); $dy = clone $zilong;
$dy ->self_introduce();
- __autoload 唯一在类定义体外使用的方法
<?php function __autoload($name)
{
echo "this one ".$name;
include($name.".php");
} $cpc = new bt('程劲','塔沟武校');
var_dump($cpc);
?> 输出结果: this one bt欢迎来到必图拳馆,我是徐晓冬object(bt)# () {
["master":protected]=>
string() "徐晓冬"
["age":"bt":private]=>
NULL
["name"]=>
string() "程劲"
["srcfrom"]=>
string() "塔沟武校"
}
php类知识---最疯狂的魔术方法serialize,_sleep,__wakeup,unserialize,__autoload,__clone的更多相关文章
- 魔术方法__sleep 和 __wakeup
感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...
- PHP与类有关的几个魔术方法
与类有关的其他魔术方法 序列化与反序列化技术 含义: 序列化: 就是将一个变量所代表的“内存”数据,转换为“字符串”形式并持久保存在硬盘上的一种做法. 反序列化: 就是将序列化之后保存在硬盘上的“字符 ...
- PHP 中 16 个魔术方法详解
PHP 中 16 个魔术方法详解 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...
- 前端学PHP之面向对象系列第二篇——魔术方法
× 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...
- PHP面向对象常见的关键字和魔术方法
在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...
- php中的常用魔术方法总结
以下是对php中的常用魔术方法进行了详细的总结介绍,需要的朋友可以过来参考下 常用的魔术方法有:__Tostring () __Call() __autoLoad() __ clone() __GET ...
- php拦截器(魔术方法)
什么是PHP拦截器? 英文名称 “interceptor”,作用是 拦截 发送未定义的方法和属性的消息. 先看一段代码,定义了一个School类,实例化一个对象$obj,获取一个未定义的属性teach ...
- PHP魔术方法
魔术方法:两个下划线开头的格式. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, ...
- PHP的魔术方法
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods) 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对 ...
随机推荐
- Compress and decompress string
You are given a string with lower case letters only. Compress it by putting the count of the letter ...
- 第二章 impala基础使用
第二章 impala基本使用 1.impala的使用 1.1.impala-shell语法 1.1.1.impala-shell的外部命令参数语法 不需要进入到impala-shell交互命令行当中即 ...
- 小记--------spark的宽依赖与窄依赖分析
窄依赖: Narrow Dependency : 一个RDD对它的父RDD,只有简单的一对一的依赖关系.RDD的每个partition仅仅依赖于父RDD中的一个partition,父RDD和子RDD的 ...
- Spring4学习回顾之路04—引用其他Bean,集合数据注入,内部Bean
引用其他Bean 组件应用程序的Bean经常需要相互协作以完成应用程序的功能,所以要求Bean能够相互访问,就必须在Bean配置文件中指定Bean的引用.在Bean的配置文件中可以用过<ref& ...
- JS实现点击查看密码功能,再次点击隐藏密码!
<table border='1'> <tr> <td>aaaa</td> <td onclick="myFunction(this.i ...
- c++11 跨平台多线程demo和qt 静态链接(std::thread有join函数,设置 QMAKE_LFLAGS = -static)
#include <stdio.h>#include <stdlib.h> #include <chrono> // std::chrono::seconds#in ...
- 数值优化(Numerical Optimization)学习系列-目录
数值优化(Numerical Optimization)学习系列-目录 置顶 2015年12月27日 19:07:11 下一步 阅读数 12291更多 分类专栏: 数值优化 版权声明:本文为博主原 ...
- Java 线程控制
一.线程控制 和线程相关的操作都定义在Thread类中,但在运行时可以获得线程执行环境的信息.比如查看可用的处理器数目(这也行?): public class RunTimeTest { public ...
- Ef数据GroupBy多字段查询Vb.net与c#参考
Dim g = lst.Data.GroupBy(Function(T) New With { Key T.mName, Key T.mUnit, Key T.mPrice }).Select(Fun ...
- Oracle连接字符串总结(转)
Oracle XE 标准连接 Oracle XE(或者"Oracle Database 10g Express Edition")是一个简单免费发布的版本. 以下是语法格式: Dr ...