getReflectedProperties(); $ep = (is_array($this->_allowedProperties)) ? array_keys($this->_allowedProperties) : null; if (! is_null($ep)) { foreach ($propertySet as $pk => $pv) { if (! in_array($pk, $p) && in_array($pk, $ep)) { $this->addExtProperty($pk, $pv); } } } else { foreach ($propertySet as $pk => $pv) { if (! in_array($pk, $p)) { $this->addExtProperty($pk, $pv); } } } return parent::fromArray($propertySet, $keyCase); } /** * @override Zeed_Object::toArray($keyCase = self::KEY_NATURAL) * @param Integer $keyCase 输出数组索引大小写转换 * @return Array */ public function toArray($keyCase = Zeed_Object::KEY_NATURAL) { $row = parent::toArray($keyCase); $orginalProperties = $this->getReflectedProperties(); $refectionObject = new ReflectionObject($this); $propertiesArray = $refectionObject->getProperties(); foreach ($propertiesArray as $property) { if (! in_array($property->name, $orginalProperties)) { $this->addExtProperty($property->name); } } return $row; } /** * 与另一个Zeed_Object的值(含扩展字段)比较(不比较类型), 返回差集数组 * 该数组包括了所有在 当前对象中但是不在参数对象中的值, 键名为字段名. * * @param Zeed_Object $obj * @return boolean */ public function diff(Zeed_Object $obj) { $row1 = $this->toArray(); $row1 = array_merge($row1, $this->getExtProperties()); $row2 = $obj->toArray(); $row2 = array_merge($row2, $obj->getExtProperties()); $return = array(); foreach ($row1 as $k => $v) { if (isset($row2[$k]) && $v != $row2[$k]) { $return[$k] = $v; } } return $return; } /** * @param String $field * @param Mixed $value * @return void */ protected function addExtProperty($field, $value = null) { if (is_null($value)) { $value = isset($this->$field) ? $this->$field : null; } $this->_extProperties[$field] = $value; } /** * @return Array */ public function getExtProperties() { return $this->_extProperties; } /** * @return Mixed */ public function getExtProperty($propertyname) { return isset($this->_extProperties[$propertyname]) ? $this->_extProperties[$propertyname] : null; } /** * @return String 序列化字串 */ public function buildPropertiesCache() { return serialize($this->_extProperties); } /** * 扩展属性表,常见是基本表名+ext * @var string */ private $_tableExt; public function setExtTable($table) { $this->_tableExt = $table; return $this; } public function getExtTable($prefix = null) { return ! empty($prefix) ? $prefix . $this->_tableExt : $this->_tableExt; } private $_extProcessClass; private $_extProcessMethod; /** * * @param string $class * @param string $method */ public function setExtProcessHandle($class, $method) { $this->_extProcessClass = $class; $this->_extProcessMethod = $method; return $this; } public function saveExt() { $handle = Zeed_Db_Model::getModel($this->_extProcessClass); $method = $this->_extProcessMethod; $handle->$method($this); } /** * 设置允许的扩展属性 * * $properties = array(propertyname=>description, 'title'=>'标题', 'username'=>用户名) * * * @param Array $propertyList * @return Zeed_Object_Ext */ public function setAllowedProperties($propertyList) { if (empty($propertyList)) { return $this; } if (is_array($this->_allowedProperties)) { $this->_allowedProperties = array_merge($this->_allowedProperties, $propertyList); } else { $this->_allowedProperties = $propertyList; } return $this; } /** * * @return array */ public function getAllowedProperties() { return $this->_allowedProperties; } } // End ^ LF ^ encoding