[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 综合 ...
随机推荐
- Java面试官最常问的volatile关键字
在Java相关的职位面试中,很多Java面试官都喜欢考察应聘者对Java并发的了解程度,以volatile关键字为切入点,往往会问到底,Java内存模型(JMM)和Java并发编程的一些特点都会被牵扯 ...
- RN 开发常见小问题
1 定时器每隔多少秒调用一次 直接贴代码 可复制使用 componentWillUnmount() { this.timer && clearInterval(this.timer) ...
- css基础--深入理解弹性盒flex布局
欢迎访问我的个人博客:http://www.xiaolongwu.cn 1. 前言 flex弹性盒,是一种布局方式,当页面需要适应不同的屏幕大小以及设备类型时,它依然能确保元素 拥有更恰当的排布行为, ...
- Oracle数据库查询优化方案(处理上百万级记录如何提高处理查询速度)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引 ...
- 消息中间件activemq的使用场景介绍(结合springboot的示例)
一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境,使 ...
- c语言常见的几种排序方法总结
一:选择排序和冒泡排序 这两种排序比较简单,直接贴出代码: #include <stdio.h> void choose_sort(int *arr, int n); void bubbl ...
- ActiveX、OLE和COM的关系(转自百度文档)
比较流行的组件模型有COM(Component Object Model,对象组件模型)/DCOM(Distributed COM,分布式对象组件模型)和CORBA(Common Object Req ...
- Hibernate Validator 6.0.9.Final - JSR 380 Reference Implementation: Reference Guide
Preface Validating data is a common task that occurs throughout all application layers, from the pre ...
- ECS上搭建Docker(CentOS7)
本文讲述Docker在CentOS系统上的部署过程.Ubuntu系统下安装docker,您可以点击此处查看.更多详细的实践您可以参考docker实践文档 适用对象 适用于熟悉Linux操作系统,刚开始 ...
- day14_DBUtils学习笔记
一.DBUtils介绍 Apache公司开发的框架. 什么是dbutils?它的作用? DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作 ...