ID: 36172 User updated by: php at justin dot meagerman dot net Reported By: php at justin dot meagerman dot net -Status: Bogus +Status: Open Bug Type: Scripting Engine problem Operating System: linux PHP Version: 5.1.2 New Comment:
Thank you for the workaround. However, the existence of a workaround does not invalidate the bug. This is clearly not expected behavior. Moreover, when __sleep methods are not defined, the behaviour is as expected, as noted below. If this really is not a bug, then it needs to be documented in the __sleep documentation page (and this bug's category should be changed to reflect that). <?php class A { private $a; public function __construct() { $this->a = 'aVal'; } } class B extends A { private $b; public function __construct() { parent::__construct(); $this->b = 'bVal'; } } $serialB = serialize(new B()); print_r(unserialize($serialB)); ?> outputs: B Object ( [b:private] => bVal [a:private] => aVal ) Previous Comments: ------------------------------------------------------------------------ [2006-01-26 20:24:42] [EMAIL PROTECTED] Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php Use interface Serializable, see: $> php --rc Serializable ------------------------------------------------------------------------ [2006-01-26 19:48:36] php at justin dot meagerman dot net this is a better title ------------------------------------------------------------------------ [2006-01-26 19:42:57] php at justin dot meagerman dot net Description: ------------ With a private member defined in a parent class and a subclass which defines a __sleep method, serialization of instances of the subclass will not save the parent's private member. This works as expected if __sleep methods are not defined. Clearly, because of name conflicts, the child __sleep cannot return the names of the parent's private members (directly, or indirectly by calling parent::__sleep), and therefore I think PHP might need to call __sleep for each class in the hierarchy. This may be the same issue the no-feedback bug #35779 was trying to convey. Reproduce code: --------------- class A { private $a; public function __construct() { $this->a = 'aVal'; } public function __sleep() { return array('a'); } } class B extends A { private $b; public function __construct() { parent::__construct(); $this->b = 'bVal'; } public function __sleep() { //return array('b'); return array_merge(parent::__sleep(), array('b')); } } $serialB = serialize(new B()); print_r(unserialize($serialB)); Expected result: ---------------- B Object ( [b:private] => bVal [a:private] => aVal ) Actual result: -------------- Notice: serialize(): "a" returned as member variable from __sleep() but does not exist in [...] B Object ( [b:private] => bVal [a:private] => [a] => ) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=36172&edit=1