MrAdam Posted July 20, 2009 Share Posted July 20, 2009 Hi guys.I've been writing a little class to handle my config functionality but gotten a little stuck with the destruct method. Exactly what scope does the destruct method have? In my class it can't seem to recognize any of the class vars or methods that I've created...ThanksAdam Link to comment Share on other sites More sharing options...
justsomeguy Posted July 20, 2009 Share Posted July 20, 2009 The destructor generally runs like you would expect, with the possible exception that you can't guarantee the order in which multiple objects get destroyed. It runs in the normal scope, and should have access to everything the other methods have access to. If your class is using properties that are objects from another class, they might be getting destroyed before your other class. If you need to guarantee that a certain object is still available when the destructor gets called, you can keep a reference to that object in the class. It won't destroy an object unless there are no references to it. I do that with a config option class I made to guarantee that it still has access to the database object when the destructor gets called: <?phpclass tc_lms_config{ private $fields; private $dirty; private $db; private $debug; private $fpath; private $db_keys; function __construct() { global $db; /* Why it is necessary to keep a reference to global db: This class uses the db object in the destructor. There is no guarantee which order objects will get destroyed in. An object will not get destroyed if there are references to it somewhere else. Storing a reference to the global db object in this class ensures that this object will be available for the destructor to use. A side-effect of this is that this class requires the db object to have already been created when an object of this class is instantiated. */ $this->debug = false; $this->fpath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.log'; $this->fields = array(); $this->dirty = array(); $this->db_keys = array(); $this->db = $db; if ($this->debug) file_put_contents($this->fpath, date('r') . " Config class created\n", FILE_APPEND); } function __destruct() { # commit changes $tmp = array(); foreach ($this->dirty as $k => $v) { $tmp[] = $k; $update = array('val' => $this->fields[$k]); if (in_array($k, $this->db_keys)) $this->db->update('config', $update, "`name`='{$k}'"); else $this->db->insert('config', array('name' => $k, 'val' => $this->fields[$k])); } if ($this->debug) file_put_contents($this->fpath, date('r') . " Config class destroyed. Updates:\n" . print_r($tmp, true), FILE_APPEND); } function get_opt($id) { if ($this->debug) file_put_contents($this->fpath, date('r') . " Get option ({$id})\n", FILE_APPEND); if (!count($this->fields)) $this->load_opts(); if (isset($this->fields[$id])) { if ($this->debug) file_put_contents($this->fpath, date('r') . " Value: {$this->fields[$id]}\n", FILE_APPEND); return $this->fields[$id]; } if ($this->debug) file_put_contents($this->fpath, date('r') . " Option not found\n", FILE_APPEND); return false; } function load_opts() { if ($this->debug) file_put_contents($this->fpath, date('r') . " Load options\n", FILE_APPEND); $this->db->sql('SELECT * FROM config ORDER BY `name` ASC'); $results = $this->db->select(); for ($i = 0; $i < count($results); $i++) { $this->fields[$results[$i]['name']] = $results[$i]['val']; $this->db_keys[] = $results[$i]['name']; } if ($this->debug) file_put_contents($this->fpath, date('r') . " Options loaded:\n" . print_r($this->fields, true), FILE_APPEND); } function set_opt($id, $val) { if ($this->debug) file_put_contents($this->fpath, date('r') . " Set option ({$id}, {$val})\n", FILE_APPEND); if (!count($this->fields)) $this->load_opts(); $this->fields[$id] = $val; $this->dirty[$id] = true; }}?> Link to comment Share on other sites More sharing options...
MrAdam Posted July 22, 2009 Author Share Posted July 22, 2009 Perfect, thanks. It turned out in the end though the problem was down to my own wrong logic. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.