ID:               35579
 Updated by:       [EMAIL PROTECTED]
 Reported By:      al dot the dot x at gmail dot com
 Status:           Open
 Bug Type:         Documentation problem
 Operating System: ANY
 PHP Version:      Irrelevant
 New Comment:

And write with big letters "references are NOT pointers!" :)


Previous Comments:
------------------------------------------------------------------------

[2005-12-07 09:20:40] al dot the dot x at gmail dot com

Description:
------------
As discussed in several bug reports and in the 
additional comments in the PHP Documentation site 
(eventually, with some reading / searching), the 
functions serialize() and unserialize() do not restore 
references to other objects in PHP 4. As that this 
behavior is unexpected _and_ intrinsic to the use of 
session data in PHP, please consider including a caveat 
or clarification in the documentation XML for the 
affected functions, the "Classes and Objects" section,  
and the "Session-Handling Functions" section.

Certainly, there's a workaround with __sleep() and 
__wakeup(), but this really needs to be addressed in the 
primary documentation in all these places, since the 
thread regarding that behavior is now buried among 
others and only appears on the description of 
serialize().

I also understand that this has been fixed as of PHP 5, 
but that's not a very helpful explanation, Most hosting 
providers currently run PHP 4.3.x or 4.4.x and place low 
priority on upgrading until the next major Apache 
version is released (maybe not even then, the slackers).

Reproduce code:
---------------
// Consider:

class dataObject {
  var $data = NULL;
  var $pointer = NULL;

  function dataObject ($newData = false) {
    if ($newData !== false) $this->data = $newData;
  } // END constructor

  function setPointer (&$newPtr) {
    return ($this->pointer =& $newPtr);
  } // END setPointer

} // END class dataObject

$A = new base('This is A');
$B = new base('This is B');
$A->setPointer(&$B);
$C = serialize($A);

// Now check the original for reference...

$B->data = "Still B, but different";
echo $A->pointer->data; // Funky syntax, I know...

// Output as expected: "Still B, but different"
// But do the same on the serialized version...

unset($A);
$A = unserialize($C);
$B->data = "Where's B now?";
echo $A->pointer->data;

// Output is old "This is B"... Not cool.
// Reference is not preserved.



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=35579&edit=1

Reply via email to