Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该在类析构函数中保存数据吗?_Php_Destructor - Fatal编程技术网

Php 我应该在类析构函数中保存数据吗?

Php 我应该在类析构函数中保存数据吗?,php,destructor,Php,Destructor,这是我的类,这个类的实例知道什么时候应该保存值。您对这个想法有什么看法?这种实现有哪些优点和缺点 class Model_User_Doc extends ArrayObject { protected $_id; protected $_value; protected $_db; protected $_changed = FALSE; public function __construct($id = NULL) { if ($i

这是我的类,这个类的实例知道什么时候应该保存值。您对这个想法有什么看法?这种实现有哪些优点和缺点

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();
    }

}

?>
这应该行得通

不过,这方面存在一些挑战

如果属性是数组或对象,则可以更改属性中的键/属性,而无需触发_集,从而触发脏/更改标志

对于析构函数的调用顺序,您实际上没有任何发言权,因此,如果没有一些猴子业务,则无法完成需要另一个保存操作(例如,对于外键管理)的值的保存操作


有些情况下不会调用析构函数。阅读更多

此问题可能更适合于代码审查。非常感谢提供有用的链接。