|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-01-26 19:42 UTC] 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] => ) PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 14:00:01 2025 UTC |
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 )