Edit report at https://bugs.php.net/bug.php?id=55801&edit=1
ID: 55801
Comment by: mapi at pdepend dot org
Reported by: mapi at pdepend dot org
Summary: Behavior of unserialize has changed
Status: Feedback
Type: Bug
Package: Variables related
Operating System: Linux (Fedora 15)
PHP Version: 5.4.0beta1
Block user comment: N
Private report: N
New Comment:
Okay, I tried for several hours to create a reproducable outside of
PHP_Depend's
context, but I cannot reproduce this behavior :(
But at least I came up with a small code fragement that illustrates this
behavior:
<?php
class Test {
function method() {
$this->prop[$y]++;
}
}
which was translated into the following object graph:
Statement
Expression
MemberPrimaryPrefix <----------
Variable |
PropertyPostfix |
ArrayIndexExpression [Same Instance]
Identifier |
Variable |
PostfixExpression |
MemberPrimaryPrefix ----------
Variable
PropertyPostfix
ArrayIndexExpression
Identifier
Variable
And this second reference to MemberPrimaryPrefix is NULL after unserialization
with PHP 5.4 and it is just a second clone with PHP < 5.4
Previous Comments:
------------------------------------------------------------------------
[2011-09-28 08:56:52] mapi at pdepend dot org
I will try to create a reproducable.
------------------------------------------------------------------------
[2011-09-28 08:51:38] [email protected]
Hm, hard to find what failed without an example then. Can you try to create a
script to generate an object tree and un/serialize it? That will be very
helpful
to fix this problem.
------------------------------------------------------------------------
[2011-09-28 08:50:27] mapi at pdepend dot org
What PHP_Depend does is serializing double linked object trees like. It uses
__sleep() to reset the child-parent link before a tree gets serialized:
class Node {
protected $parent;
protected $nodes = array();
public function __sleep() {
return array('nodes');
}
}
And it uses __wakeup() to restore this link during the unserialization:
class Node {
protected $parent;
protected $nodes = array();
public function __sleep() {
return array('nodes');
}
public function __wakeup() {
foreach ($this->nodes as $node) {
$node->parent = $this;
}
}
}
Now it seems that under certain circumstances the $this->nodes property is an
array when __wakeup() is called, but instead of objects the array values are
NULL.
This happens when the following PHP Warning occurs:
PHP Warning: Creating default object from empty value
in /tmp/pdepend/src/main/php/PHP/Depend/Code/ASTNode.php on line 569
------------------------------------------------------------------------
[2011-09-28 08:36:08] mapi at pdepend dot org
No it's about large object trees serialized in PHP 5.4 and unserialized with
the
same version. This has worked with all PHP versions < 5.4.
It seems that these object trees are now unserialized or serialized or
destructed
in a different order, so that some of the previous objects are now NULL.
------------------------------------------------------------------------
[2011-09-27 20:16:39] [email protected]
Is it about objects being serialized and stored using 5.3 and unserialized
using
5.4? And it fails to unserialize them?
Or are you doing this proecess manually?
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=55801
--
Edit this bug report at https://bugs.php.net/bug.php?id=55801&edit=1