note 48451 added to function.serialize

From: Date: Fri, 24 Dec 2004 07:16:45 +0000
Subject: note 48451 added to function.serialize
Groups: php.notes 
Request: Send a blank email to php-notes+get-82231@lists.php.net to get a copy of this message
More on troubles with recursive object references and serialization. In my PHP 4.2.2 the solution suggested above (by james at gogo dot co dot nz), to pass a reference to the object to serialize(), does not help. There are still multiple copies of the objects woken up, and the recursive reference is no longer recursive. The only solution I have found is to use the __sleep and __wakeup magic functions to only serialize the link one-way, then recreate it manually on unserialize. This isn't too difficult; here is some code demonstrating this approach: class A { var $data = Null; var $b = Null; function A($data, $bData) { $this->data = $data; $this->b = new B(&$this, $bData); } function printData() { print 'A thinks A data is ' . $this->data . "\n"; print 'A thinks B data is ' . $this->b->data . "\n"; } function __sleep() { print "A is going to sleep.\n"; return array('data', 'b'); } function __wakeup(){ print "A is waking up.\n"; $this->b->reLinkA($this); } } class B { var $data = Null; var $a = Null; function B(&$a, $data) { $this->a =& $a; $this->data = $data; } function printData() { print 'B thinks A data is ' . $this->a->data . "\n"; print 'B thinks B data is ' . $this->data . "\n"; } function __sleep() { print "B is going to sleep.\n"; return array('data'); } function __wakeup(){ print "B is waking up.\n"; } function reLinkA(&$a) { $this->a =& $a; } } $a = new A("origAdata", "origBdata"); print '<pre>'; print "I think A data is " . $a->data . "\n"; print "I think B data is " . $a->b->data . "\n"; $a->printData(); $a->b->printData(); $serA = serialize($a); $newA = unserialize($serA); $newA->data = 'newAdata'; $newA->b->data = 'newBdata'; print "I think new A data is " . $newA->data . "\n"; print "I think new B data is " . $newA->b->data . "\n"; $newA->printData(); $newA->b->printData(); ---- Manual Page -- http://www.php.net/manual/en/function.serialize.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+48451 Delete -- http://master.php.net/manage/user-notes.php?action=delete+48451&report=yes Reason: bad code -- http://master.php.net/manage/user-notes.php?action=delete+48451&report=yes&reason=bad+code Reason: spam -- http://master.php.net/manage/user-notes.php?action=delete+48451&report=yes&reason=spam Reason: useless example -- http://master.php.net/manage/user-notes.php?action=delete+48451&report=yes&reason=useless+example Reason: contains commercial links -- http://master.php.net/manage/user-notes.php?action=delete+48451&report=yes&reason=contains+commercial+links Reason: useless note -- http://master.php.net/manage/user-notes.php?action=delete+48451&report=yes&reason=useless+note Reject -- http://master.php.net/manage/user-notes.php?action=reject+48451&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#82231) next »