Hey

I'm building a webapp with tons of objects all over the place, a lot
of which are quite complex, meaning they could have many subclasses
and many nested object members. I'm implementing a memory caching
mechanism to store these objects between requests and share them
between different user sessions.

In order for my memory caching mechanism to work, objects must be
serialised before they are placed into the cache. In PHP5, this
presents some problems for me, mostly to do with having multiple
copies of the same object floating around after an object is returned
from the cache (unserialised). I'm getting around this by preparing my
objects for caching using the __sleep() method: serialising only
certain instance variables and then using __wakeup() to ensure I'm
still only working with one copy of any object.

My question is: how do you use __sleep() in conjunction with a parent
class whose members are private?

I'm having problems as I've declared most of the instance variables in
the classes of my inheritance hierarchy to be private. This means that
I cannot recursively call __sleep() on parent classes in order to
merge the variables together and return a complete array of variable
names from the top-level function.

An example:

class MyParent
{
        private $var1; // serialise
        private $var2; // don't' serialise
        
        function __construct()
        {
                $this -> var1 = "Hello World";
                $this -> var2 = "Goodbye World";
        }

        function __sleep()
        {
                return array("var1");
        }
}

class MyChild extends MyParent
{
        private $var3; // serialise
        private $var4;  // don't serialise
        
        function __construct()
        {
                $this -> var3 = "Hello World II";
                $this -> var4 = "Goodbye World II";
        }

        function __sleep()
        {
                return array_merge(parent::__sleep(), array("var3"));
        }
}

$mc = new MyChild();
$mcSerialised = serialize($mc);

When I try to serialise $mc I get the following notice due to $var1's
access modifier in MyParent:

Notice: serialize() [function.serialize]: "var1" returned as member
variable
        from __sleep() but does not exist in /var/www/...

So now I'm thinking that if I just call parent::__sleep() in the
__sleep() function of MyChild  then PHP will figure out that I'm
trying to serialise the instance members of my parent class too.
Doesn't work. In fact I can't think of any way to do this, other than
with some horrendous hacks, or just by declaring all my instance
variables to be protected.

Has anyone seen this before? Can anyone think of a workaround?
Obviously it wouldn't have been a problem in PHP4, as there were no
private/protected access modifiers. Perhaps this means that __sleep()
and __wakeup() don't really work for inherited objects in PHP5?

Thanks,
Rob

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to