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(),在对 ...
随机推荐
- JDK1.8 新特性(全)
原文链接:https://blog.csdn.net/qq_29411737/article/details/80835658
- Redis 是怎么实现 “附近的人” 的?
针对"附近的人"这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoDB等多种DB的空间索引进行实现. 而Redis另辟蹊径,结合其有序队列zset以及geohas ...
- CentOS7-部署kubernetes
1 环境准备 节点 主机名 IP OS Master k8s-master 192.168.57.1 centos 7 Node1 k8s-nod ...
- Docker——四种网络模式
docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式: bridge模式:使用–net =bridge指定,默认设置: host模式 ...
- 怎样将当前节点从DOM树中移除
1. 获取到当前节点. 2. 获取到当前节点的父节点. 3. 使用 Node.prototype.removeChild() 移除当前节点. <!DOCTYPE html> <htm ...
- linux 安装telnet、curl、ifconfig、vim、ping等工具
1.首先执行下面命令更新相关源 apt-get update 2.安装telnet apt-get install telnet 3.安装curl apt-get install curl 4.安装i ...
- python 列表反转
反转: 将原列表反转,返回None: li = [1, 2, 3]li.reverse()print(li)# [3, 2, 1]1234不改变原列表,返回反转后的新列表: li = [1, 2, 3 ...
- VC++ warning C4819 的解决方法(转)
编译VC++程序的时候出现如下提示警告: warning C4819: The file contains a character that cannot be represented in the ...
- 客户端注册Cannot execute request on any known server解决
在对eureka注册中心服务端添加安全验证后,新版本springcloud出现一个问题就是,在客户端注册到服务中心时报了一个错:Cannot execute request on any known ...
- vue中修改数组,dom未更新的问题
vue中我们会频繁操作各种数据,但有时候发现修改完数据以后,dom并未更新? 比如有一个数组对象: obj = [{'name': 'joy'},{'name': 'bowen'}] 我要循坏插入某个 ...