[PHP]实体类基类和序列化__sleep问题
1.构造函数传参
2.__get和__set实现,当调用不存在的属性的时候,可以取值和赋值到data属性数组
3.__sleep实现,当序列化对象的时候,只序列化data属性数组和类内初始化定义的字段
4.__isset实现,可以判断属性是否存在,通过判断data属性数组
5.toArray方法实现,返回data属性数组
6.记录了构造初始化后,动态添加的属性字段
<?php class Sina_Data_Object
{
protected $data = array();
private $changes = array();
private $newFlag = true;
public function __construct($data = array()){
if (empty($data)) {
$this->newFlag = true;
} else {
$this->newFlag = false;
foreach ($data as $k => $v) {
$this->data[$k] = $v;
}
}
} public function __isset($name){
return isset($this->data[$name]);
} public function __get($name){
if(!array_key_exists($name, $this->data)){
return null;
}
return $this->data[$name];
} public function __set($name, $value){
$this->data[$name] = $value;
if (!$this->newFlag) {
$this->changes[$name] = $value;
}
} public function __sleep(){
return array('data');
} public function toArray(){
return $this->data;
} public function isNew(){
return $this->newFlag;
} public function clearNewFlag(){
$this->newFlag = false;
} public function isModified()
{
return (!empty($this->changes));
} public function getChanges()
{
return $this->changes;
} public function clearChanges()
{
$this->changes = array();
}
}
class Setting extends Sina_Data_Object{
const STATUS=1;
public $other='aaa';
public function __construct($data=array()){
parent::__construct($data);
}
}
//初始化对象
$data=array('user'=>'taoshihan');
$setting=new Setting($data);
//动态增加属性
$setting->age=100;
var_dump($setting);
/*
object(Setting)#1 (4) {
["other"]=>
string(3) "aaa"
["data":protected]=>
array(2) {
["user"]=>
string(9) "taoshihan"
["age"]=>
int(100)
}
["changes":"Sina_Data_Object":private]=>
array(1) {
["age"]=>
int(100)
}
["newFlag":"Sina_Data_Object":private]=>
bool(false)
} */ //动态改变初始化的字段
$setting->other='bbbb';
//序列化对象
$serializeSetting=serialize($setting);
//反序列化对象
$setting2=unserialize($serializeSetting);
var_dump($setting2);
/*
object(Setting)#2 (4) {
["other"]=>
string(3) "aaa" ########反序列化回来这里还是aaa
["data":protected]=>
array(3) {
["user"]=>
string(9) "taoshihan"
["age"]=>
int(100)
}
["changes":"Sina_Data_Object":private]=>
array(0) { ##########change属性里面的数据没有序列化进去
}
["newFlag":"Sina_Data_Object":private]=>
bool(true) #########反序列化回来这里是true
} */
[PHP]实体类基类和序列化__sleep问题的更多相关文章
- 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 20 BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- 关于Java抽象类,接口与实现接口及派生类继承基类
1. 抽象类 抽象类就是有一个或多个方法只被声明而未被实现. 抽象方法的声明以分号结束,并且用关键字abstract来说明它以标识它为抽象方法. 格式: public abstract class 类 ...
- c++ 的类 和 类继承, 什么是c++中的基类和派生类?
闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...
- EF实体框架数据操作基类(转)
//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)
本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...
- 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类
折腾几天记载一下,由于项目实际需要,从edmx生成的实体类能自动继承自定义的基类,这个基类不是从edmx文件中添加的Entityobject. 利用ADO.NET C# POCO Entity Gen ...
- DRF基类APIView提供的Request、Response和序列化器的综合使用
关于DRF基类APIView提供的Request和Response对象的作用,可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9939864.html 综合 ...
随机推荐
- linux基础命令用法
目录管理 ls.cd.pwd.mkdir.rmdir.tree ls(list) 列出,列表 用法: ls -l:长格式 文件类型: -:普通文件 (f) d: 目录文件 b: 块设备文件 (bloc ...
- webpack,配置,上手,例子
1.webpack是什么? 2.为什么要用webpack? 3.怎么用webpack? webpack是什么? 答:webpack是前端模块化应用和开发的打包工具,解决前端模块依赖的工具.打包所有的脚 ...
- codeforces 983B XOR-pyramid
题意: 定义一个函数f(a): 给出一个数组a,有q个询问,每次询问回答在l到r的区间内,连续子串的f函数的最大值. 思路: 画图,来自codeforces SheepRanger 由此图可知,f(l ...
- Archlinux安裝指南(uefi+gpt)
1.系统安装前的一些准备 首先在Archlinux官网下载镜像文件,然后刻录到U盘或光盘上.在我的机器上刻录arch镜像文件到U盘后启动不了,因为时间问题我没做过多的探索,所以后面直接刻录到光盘,用光 ...
- 初识函数库libpcap
由于工作上的需要,最近简单学习了抓包函数库libpcap,顺便记下笔记,方便以后查看 一.libpcap简介 libpcap(Packet Capture Library),即数据包捕获函数库, ...
- Centos7搭建hadoop完全分布式
虽然说是完全分布式,但三个节点也都是在一台机器上.拿来练手也只能这样咯,将就下.效果是一样滴.这个我自己都忘了步骤,一起来回顾下吧. 必备知识: Linux基本命令 vim基本命令 准备软件: VMw ...
- js判断浏览器是否支持flash的方法
传统浏览器可以使用window.ActiveXObject检查浏览器是否启用相关的控件.检查浏览器是否启用flash控件,需要先检查浏览器是否支持ActiveXObject,可以使用typeof检查w ...
- 对JDK的深入理解
今天对Java的jdk有了更加深入的理解: Java的jdk其实一共包含三部分内容: 1.工具包 2.类库 3.JRE jdk的全名:Java develop kit (java开发工具) jdk包含 ...
- Vue.js中前端知识点总结笔记
1.框架和库的区别: 框架:framework 有着自己的语法特点.都有对应的各个模块库 library 专注于一点 框架的好处: 1.提到代码的质量,开发速度 2.提高代码的复用率 3.降低模块之间 ...
- 带BOM头文件解析
在java中apache提供了一个工具类BOMStream,在获取文件流时,将获取到的文件流转化成为BOM流: InputStreamReader is = new InputStreamReader ...