ID: 26737 Comment by: trevorrowe at gmail dot com Reported By: rob at cue dot cc Status: No Feedback Bug Type: Zend Engine 2 problem Operating System: * PHP Version: 5CVS New Comment:
Last posting was made on feb 26, its now jul 12. ------------------------------------------------ Anyone have any more current news on this bug? The bug seems to still persist in php5 rc3. mastabog's suggestion of padding the variable name with nulls for private, padding the * for protected and nothing for public works, but seems like an ugly hack. My biggest fear is when the bug is patched, my variable names will be double padded and things will start to break. Previous Comments: ------------------------------------------------------------------------ [2004-02-26 21:24:38] mastabog at hotmail dot com 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 :) ------------------------------------------------------------------------ [2004-02-26 20:34:43] mastabog at hotmail dot com Same problem here. And I'm downloading the CVS php5 version daily since May 2003. I assumed this was to be solved in a much later stage seeing that all CVS releases (and all 4 betas of PHP5) had this bug. In all my php5 projects i haven't use any __sleep() methods at all because they weren't working. I use php5 mainly with win32 and about once a week with Linux. Both have this bug ... very irritating (I have some objects that make my session file go up to 100kb, because i cant use __sleep(), which would be large for a production site.) ------------------------------------------------------------------------ [2004-01-17 00:51:27] [EMAIL PROTECTED] No feedback was provided. The bug is being suspended because we assume that you are no longer experiencing the problem. If this is not the case and you are able to provide the information that was requested earlier, please do so and change the status of the bug back to "Open". Thank you. ------------------------------------------------------------------------ [2003-12-30 20:11:12] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php5-latest.tar.gz For Windows: http://snaps.php.net/win32/php5-win32-latest.zip ------------------------------------------------------------------------ [2003-12-29 00:20:44] rob at cue dot cc 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:"[EMAIL PROTECTED]@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(). ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=26737&edit=1