1.構造函數傳參
2.__get和__set實現,當調用不存在的屬性的時候,能夠取值和賦值到data屬性數組
3.__sleep實現,當序列化對象的時候,只序列化data屬性數組和類內初始化定義的字段
4.__isset實現,能夠判斷屬性是否存在,經過判斷data屬性數組
5.toArray方法實現,返回data屬性數組
6.記錄了構造初始化後,動態添加的屬性字段php
<?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 } */