From: ectsue at gmail dot com
Operating system: MacOS X
PHP version: 5.0.5
PHP Bug Type: Feature/Change Request
Bug description: Unintuitive serialization for inherited objects.
Description:
------------
I believe that the way serialization works for objects
doesn't make sense. I have a subclass whose superclass
contains a private member variable. Upon serialization, I
cannot get the private member variable to serialize for the
subclass (except by using a "NUL class-name NUL member-name"
string in __sleep()).
Imho, subclasses shouldn't have to know what parts of their
parent classes to serialize. I can think of two possible
solutions to this problem:
1. Have serialize() walk the inheritance tree for the object
it is serializing.
2. Have some method that will be able to take the output
from parent::__sleep() and modify it so that it can be
passed back from the __sleep() method of the subclass so
that private member variables in the parent can be
serialized. (The function I have in mind would do the NUL
class-name NUL member-name transformation).
Reproduce code:
---------------
class A {
private $a;
public function __sleep() { return array('a'); }
public function getA() { return $this->a; }
public function setA($a) { $this->a = $a; }
}
class B extends A {
}
$b = new B();
$b->setA(10);
$bSerialized = serialize($b);
$bUnserialized = unserialize($bSerialized);
var_dump($b);
var_dump($bUnserialized);
Expected result:
----------------
object(B)#1 (1) {
["a:private"]=>
int(10)
}
object(B)#1 (1) {
["a:private"]=>
int(10)
}
Actual result:
--------------
object(B)#1 (1) {
["a:private"]=>
int(10)
}
object(B)#2 (2) {
["a:private"]=>
NULL
["a"]=>
NULL
}
--
Edit bug report at http://bugs.php.net/?id=34593&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=34593&r=trysnapshot4
Try a CVS snapshot (php5.0):
http://bugs.php.net/fix.php?id=34593&r=trysnapshot50
Try a CVS snapshot (php5.1):
http://bugs.php.net/fix.php?id=34593&r=trysnapshot51
Fixed in CVS: http://bugs.php.net/fix.php?id=34593&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=34593&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=34593&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=34593&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=34593&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=34593&r=support
Expected behavior: http://bugs.php.net/fix.php?id=34593&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=34593&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=34593&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=34593&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=34593&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=34593&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=34593&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=34593&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=34593&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=34593&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=34593&r=mysqlcfg