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问题的更多相关文章

  1. 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  2. 20 BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  3. Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  4. 关于Java抽象类,接口与实现接口及派生类继承基类

    1. 抽象类 抽象类就是有一个或多个方法只被声明而未被实现. 抽象方法的声明以分号结束,并且用关键字abstract来说明它以标识它为抽象方法. 格式: public abstract class 类 ...

  5. c++ 的类 和 类继承, 什么是c++中的基类和派生类?

    闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...

  6. EF实体框架数据操作基类(转)

    //----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...

  7. Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)

    本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...

  8. 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

    折腾几天记载一下,由于项目实际需要,从edmx生成的实体类能自动继承自定义的基类,这个基类不是从edmx文件中添加的Entityobject. 利用ADO.NET C# POCO Entity Gen ...

  9. DRF基类APIView提供的Request、Response和序列化器的综合使用

    关于DRF基类APIView提供的Request和Response对象的作用,可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9939864.html 综合 ...

随机推荐

  1. eclipse 安装svn和gradle

    公司项目用的eclispe  svn和gradle 所以需要配置 SVN教程:https://blog.csdn.net/jieshaowang1229/article/details/5159499 ...

  2. python奇技淫巧——max/min函数的用法

    本文以max()为例,对min/max内建函数进行说明 源码 def max(*args, key=None): # known special case of max ""&qu ...

  3. python装饰器小计

    1.装饰器:本质是函数,是用来给其他函数添加附加扩展功能的函数,其返回值是一个函数(函数指针) 2.装饰器作用:不改变函数源代码和函数调用方式的前提下添加函数的附加功能. 3.装饰器储备知识点: A. ...

  4. 微信小游戏开发之四:使用three.js引擎

    一.前言 微信小游戏中最魔性的'跳一跳'就是基于three.js 引擎开发的 源码放到github上了:GitHub地址   请自行下载. 二.下载 three.min.js 打开页面,复制代码到本地 ...

  5. java开发中的Mutex vs Semaphore

    先看一下stackoverflow上是怎么说的吧 原文地址:http://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore- ...

  6. Jacob工具类使用文件互转服务 word转html html转excel word转pdf excel转pdf ppt转pdf

    前提条件  必须安装MS office 1.jdk使用jdk1.8 2.jacob.dll放在..\jdk1.8\jre\bin目录下 3.eclipse的jre版本要和jdk一致,window-&g ...

  7. SSM-SpringMVC-01:SpringMVC是什么?SpringMVC执行流程

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- SpringMVC简介: SpringMVC也叫Spring Web  mvc,属于表现层的框架.Sprin ...

  8. 好代码是管出来的——使用Git来管理源代码

    软件开发过程中一个重要的产出就是代码,软件的编码过程一般是由一个团队共同完成,它是一个并行活动,为了保证代码在多人开发中能够顺利完成,我们需要使用代码版本控制工具来对代码进行统一存储,并追踪每一份代码 ...

  9. 为何没有asia/beijing时区?

    Asia/Beijing 这个时区是消失了么? 大约1小时 ago @tinyfool 对啊,我就奇怪为什么北京时间就要用上海和成都... 大约1小时 ago @tinyfool @CatChen我所 ...

  10. selenium的一些使用方法

    新建实例driver = webdriver.Chrome()1.通过标签属性Id查找元素方法:find_element_by_id(element_id)实例:driver.find_element ...