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:
It seems that this has something todo with the visibility of properties that
should be serialized. If I do the following:
~ $ rm -rf ~/.pdepend
~ $ git clone https://github.com/pdepend/pdepend.git
~ $ cd pdepend
~ $ vim src/main/php/PHP/Depend/Code/AbstractClassOrInterface.php +86
-> Change from PROTECTED to PUBLIC
protected $parentClassReference = null; -> public $parentClassReference =
null;
~ $ vim src/main/php/PHP/Depend/Code/AbstractClassOrInterface.php +132
-> Change from PROTECTED to PUBLIC
protected $nodes = array(); -> public $nodes = array();
~ $ php540 src/bin/pdepend.php --summary-xml=sum.xml
src/main/php/PHP/Depend/Code/ASTArrayType.php
~ $ php540 src/bin/pdepend.php --summary-xml=sum.xml
src/main/php/PHP/Depend/Code/ASTArrayType.php
...
Executing CyclomaticComplexity-Analyzer:
Fatal error: Call to a member function findChildrenOfType() on a non-object in
/tmp/pdepend/src/main/php/PHP/Depend/Code/AbstractClassOrInterface.php on line
268
If I now revert the visibility of both properties from PUBLIC to PROTECTED, it
works:
~ $ vim src/main/php/PHP/Depend/Code/AbstractClassOrInterface.php +86
-> Change from PUBLIC to PROTECTED
public $parentClassReference = null; -> protected $parentClassReference =
null;
~ $ vim src/main/php/PHP/Depend/Code/AbstractClassOrInterface.php +132
-> Change from PUBLIC to PROTECTED
public $nodes = array(); -> protected $nodes = array();
~ $ php540 src/bin/pdepend.php --summary-xml=sum.xml
src/main/php/PHP/Depend/Code/ASTArrayType.php
This means that a PUBLIC property that was serialized can be restored in a
PROTECTED property while unserializing the object structure.
Previous Comments:
------------------------------------------------------------------------
[2011-09-28 15:20:33] mapi at pdepend dot org
Yes, here you can get the two serialized object structures:
http://manuel-pichler.de/stuff/5.3.serhttp://manuel-pichler.de/stuff/5.4.ser
And there is the difference:
5.3 -> *nodes";a:1:{i:0;r:18;}}}}}}}}}
5.4 -> *nodes";a:1:{i:0;r:36;}}}}}}}}}
It references something different.
------------------------------------------------------------------------
[2011-09-28 13:41:54] pajoye@php.net
Any chance to get something that shows us the serialized data with 5.4 and 5.4 so
we can see how they differ?
Maybe upload the small possible code somewhere?
------------------------------------------------------------------------
[2011-09-28 13:30:46] mapi at pdepend dot org
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
------------------------------------------------------------------------
[2011-09-28 08:56:52] mapi at pdepend dot org
I will try to create a reproducable.
------------------------------------------------------------------------
[2011-09-28 08:51:38] pajoye@php.net
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.
------------------------------------------------------------------------
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