From:             mastabog at hotmail dot com
Operating system: Win32, Linux and on all tested
PHP version:      5CVS-2004-04-20 (dev)
PHP Bug Type:     Zend Engine 2 problem
Bug description:  __sleep() reproducible serialization bug (at least i hope so)

Description:
------------
I posted this as a comment to an existing bug report (after it has been
suspended). The bug report is 4 months old and can be found here:
http://bugs.php.net/bug.php?id=26737

Everything written there (including the last comment which is mine) is
still true, unfortunately.

That bug existed since my first attempt to use __sleep() in PHP5 (approx 1
year ago) and persisted since (i alway use the daily php5-cvs version)

Here is a summary (though I suggest you take a look at the original bug at
the link above).

__sleep() serialization does not work unless you do this: You not only
have to enclose 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. The string that needs to be enclosed
in null chars is (let x be the property name):

1. class name, if x is 'private' (i.e. "\0" . __CLASS__ . "\0x")
2. *, if x is 'protected' (i.e. "\0*\0x")
3. Null, if x is 'public' => (i.e. "x")

Here's what I mean (this is how it should be done in order to work ...
meaning to avoid/workaround this bug):

<?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, because forming those strings with null
chars is just, well, ugly and inconsistent.

Reproduce code:
---------------
<?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");
  }

  // This is how it should be, IMHO (php4 style)
  //function __sleep()
  //{
  //  return array("a", "b", "c");
  //}

}

?>


Expected result:
----------------
With the 2nd __sleep() uncommented you should get the normal serialized
properties of the object. Instead, every private/protected members come up
emtpy.



-- 
Edit bug report at http://bugs.php.net/?id=28082&edit=1
-- 
Try a CVS snapshot (php4):  http://bugs.php.net/fix.php?id=28082&r=trysnapshot4
Try a CVS snapshot (php5):  http://bugs.php.net/fix.php?id=28082&r=trysnapshot5
Fixed in CVS:               http://bugs.php.net/fix.php?id=28082&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=28082&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=28082&r=needtrace
Need Reproduce Script:      http://bugs.php.net/fix.php?id=28082&r=needscript
Try newer version:          http://bugs.php.net/fix.php?id=28082&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=28082&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=28082&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=28082&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=28082&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=28082&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=28082&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=28082&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=28082&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=28082&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=28082&r=float

Reply via email to