|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2003-12-29 00:20 UTC] rob dot wills at gmail dot com
Description:
------------
I have an object instance ($obj_root) that I want to
persist in a
session.
The object's class (object_container) defines the
__sleep() function, and
returns the array of member variables to be serialized.
function __sleep()
{
return array("objs");
}
The member variable 'objs' ($this->objs = array('foo');)
is not serialized as expected;
Arrays or other object-types result in null strings.
Upon comparing the serialized instance strings, I have
discovered that the string-ified names of the member
variables are very different:
serialize() without __sleep() wraps null chars around
the instance class name, followed by the member variable
name.
obj_root|O:16:"object_container":1:{s:
22:"^@object_container^@objs";a:1:{s:3:"foo" ....
serialize() with __sleep() uses the plain member
variable name, and dismisses it as null.
If I use the __sleep() function and supply the member
variable name with null chars quoting the class name the
serialization works.
function __sleep()
{
return array("\0object_container\0objs");
}
Could this be a bug, or should the documentation be
updated to reflect this curious behaviour of __sleep().
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 23:00:01 2025 UTC |
Complete info on this bug: To quote "rob at cue dot cc", you don't have to enclose only the class name with null characters. As far as I've seen you have to enclose with null chars ALL Php5 serialization identifiers of class properties types, the ones I figured out to be for now (let x be the property name): - class name if x is 'private' => "\0" . __CLASS__ . "\0x" - * if x is 'protected' => "\0*\0x" - nothing if x is 'public' => "x" Here's what I mean: <?php class aTest { public $a = 'one'; protected $b = 'two'; private $c = 'three'; private $d = 'something you dont wanna save'; function __sleep() { return array("a", "\0*\0b", "\0aTest\0c"); // or // return array("a", // "\0*\0b", // "\0" . __CLASS__ . "\0c"); } } ?> Anything else in the return array of __sleep() and the property will come up empty after unserialization ... not nice. My hope is that this is a bug, cus forming those strings with null chars is just, well, ugly :)I really *really* don't understand why this bug (it is a bug .. everyone sees it that way) doesn't get fixed. It's quite important ... Padding the variables with nulls and classname or * is not my suggestion or hack, it's what I've seen it does looking in the session file. Currently ther eis no other way to selectively save variables between sessions. Right now i'm using the Reflection API to autodetect property types and then construct the array for __sleep(). Hope I won't be force to develop too many of those ... For {albin at kth dot se}: the point of specifying which variables to save is quite easy to explain .. sometimes you only want to save a few out of a bunch of properties. Its easier to state those which you want to save than those which you don't. Of course, sometimes its the othr way around and you wish you had something to specify those you don't want. Here's where the Reflection API can help (see the Zend2 Engine changes, bottom: http://sitten-polizei.de/php/reflection_api/docs/language.reflection.html)