这是我的类,这个类的实例知道什么时候应该保存值。你怎么看这个想法?这个实现的优点和缺点是什么?
class Model_User_Doc extends ArrayObject {
protected $_id;
protected $_value;
protected $_db;
protected $_changed = FALSE;
public function __construct($id = NULL) {
if ($id !== NULL) {
$this->_id = $id;
$this->_db = DB::instance();
$this->_value = $this->_db->get($id);
}
}
public function __set($key, $value) {
$this->_changed = TRUE;
$this->_value[$key] = $value;
}
public function __get($key) {
if (isset($this->_value[$key])) {
return $this->_value[$key];
}
return NULL;
}
public function __unset($key) {
$result = FALSE;
if (isset($this->_value[$key])) {
$this->_changed = TRUE;
unset($this->_value[$key]);
$result = TRUE;
}
return $result;
}
public function offsetGet($name) {
return $this->_value[$name];
}
public function offsetSet($name, $value) {
$this->_changed = TRUE;
$this->_value[$name] = $value;
}
public function offsetExists($name) {
return isset($this->_value[$name]);
}
public function offsetUnset($name) {
$this->_changed = TRUE;
unset($this->_value[$name]);
}
public function cas() {
if ($this->_changed === TRUE) {
$this->save();
}
}
public function save() {
$this->_db->set($this->_id, $this->_value);
$this->_changed = FALSE;
}
public function __destruct() {
$this->cas();
}
}
?>
应该可以。
尽管如此,还是有一些挑战。
如果属性是数组或对象,则可以在不触发__set的情况下更改属性中的键/属性,从而触发dirty/changed标志。
对于调用析构函数的顺序,您实际上没有任何发言权,因此,如果保存操作需要另一个保存操作(例如外键管理)的值,则无法在没有一些猴子业务的情况下完成。
在某些情况下,析构函数不会被调用。点击这里阅读更多内容