That is perfect Duncan, that was my first impression, but I think i read that
there was something to adding new magic methods, however, i think that would
be the perfect solution.
On Wednesday 11 May 2005 06:14, Duncan McIntyre wrote:
> Wez,
>
> I have similar problems. I think your suggested solution is the wrong
> approach because your problem is not creating objects, it is destroying
> them.
>
> My solution would be to define a new magic static method __free() which is
> given an instance of the class every time a reference to that instance is
> deleted. This would be a hook into the code which calls __destruct() once
> an object's ref count reaches zero, except that it would call __free()
> every time an object's ref count was decremented.
>
> class SomeClass {
> public static __free($instance) {
> /**
> * Do some static instance caching magic here
> **/
> }
> }
>
> This would be a neat addition to the language, but unless it is implemented
> you will have to use a bit of discipline in writing your code instead.
>
> The example below is probably the best you can do:
>
> /**
> * This class provides the mechanism to load objects from the database
> * and caches loaded instances
> **/
> class ObjectStore {
>
> static $instances=array();
>
> public static function loadObject($class, $id) {
> if(isset(ObjectStore::instances[$class][$id])) {
> ObjectStore::instances[$class][$id][1]++;
> return ObjectStore::instances[$class][$id][0];
> }
>
> $handle = SomeDatabaseClass::getHandle();
> $result = $handle->query("SELECT * FROM $class WHERE id=$id");
> if(!$result->num_rows()) {
> throw new Exception("Object $class $id does not exist
> in the database");
> }
> $r = $result->fetch_object();
> $obj = new $class();
> $obj->deserialize($r);
> ObjectStore::instances[$class][$id]=array($obj, 1);
> return $obj;
> }
>
> public static function free($obj) {
> ObjectStore::instances[$obj->class][$obj->id][1]--;
> if(!ObjectStore::instances[$obj->class][$obj->id][1]) {
> unset(ObjectStore::instances[$obj->class][$obj->id]);
> }
> }
> }
>
> /**
> * All classes stored in the database must extend this class
> **/
> abstract class PersistentObject {
> public function free() {
> static $freed;
> if(!$freed) {
> ObjectStore::free($this);
> $freed=true;
> }
> return $this;
> }
>
> /**
> * Retrieve the object's properties from a database row
> **/
> abstract public function deserialize($db_object);
> }
>
> Then load objects by calling
>
> $obj = ObjectStore::loadObject("SomeClass",27);
> And when you're done with them call unset($obj->free());
>
> Any classes which consume PersistentObjects must have a method __destruct()
> which calls free() on any PersistentObjects they have references to in
> order for this to work.
>
> Duncan
--
Leonardo Pedretti
Axon Sistemas
L�der de Equipo Proyecto Basalto
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php