Edit report at https://bugs.php.net/bug.php?id=55801&edit=1

 ID:                 55801
 Updated by:         paj...@php.net
 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:

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?


Previous Comments:
------------------------------------------------------------------------
[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] paj...@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.

------------------------------------------------------------------------
[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.

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


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

Reply via email to