Professional Web Applications Themes

#25975 [Opn->Bgs]: PHP 5 object references don't survive serialization - PHP Development

ID: 25975 Updated by: [email]sniperphp.net[/email] Reported By: reiersol at online dot no -Status: Open +Status: Bogus Bug Type: Session related Operating System: Linux RedHat 9.0 PHP Version: 5CVS-2003-10-24 (dev) New Comment: There are no references in the before serialize object, so why should there be references after serializing/unserializing? Previous Comments: ------------------------------------------------------------------------ [2003-10-24 08:11:44] reiersol at online dot no The last line of the code example (print $1) is meaningless. Sorry. ------------------------------------------------------------------------ [2003-10-24 08:08:59] reiersol at online dot no Description: ------------ Object references inside PHP5 objects are not preserved through serialize/unserialize like traditional PHP4 references. This means they cannot be used ...

  1. #1

    Default #25975 [Opn->Bgs]: PHP 5 object references don't survive serialization

    ID: 25975
    Updated by: [email]sniperphp.net[/email]
    Reported By: reiersol at online dot no
    -Status: Open
    +Status: Bogus
    Bug Type: Session related
    Operating System: Linux RedHat 9.0
    PHP Version: 5CVS-2003-10-24 (dev)
    New Comment:

    There are no references in the before serialize object, so why should
    there be references after serializing/unserializing?



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

    [2003-10-24 08:11:44] reiersol at online dot no

    The last line of the code example (print $1) is meaningless. Sorry.

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

    [2003-10-24 08:08:59] reiersol at online dot no

    Description:
    ------------
    Object references inside PHP5 objects are not preserved through
    serialize/unserialize like traditional PHP4 references. This means they
    cannot be used in session-based applications.

    Reproduce code:
    ---------------
    class Bar {}
    class Foo {
    var $v1;
    var $v2;
    function Foo() {
    $this->v1 = new Bar;
    $this->v2 = $this->v1;
    }
    }

    $f = new Foo;
    var_dump($f);
    $g = unserialize(serialize($f));
    var_dump($g);
    print $s1;


    Expected result:
    ----------------
    This is what I get if I use $this->v2 = &this->$v1 instead of $this->v2
    = $this->v1:

    object(foo)#1 (2) {
    ["v1"]=>
    &object(bar)#2 (0) {
    }
    ["v2"]=>
    &object(bar)#2 (0) {
    }
    }
    object(foo)#3 (2) {
    ["v1"]=>
    &object(bar)#4 (0) {
    }
    ["v2"]=>
    &object(bar)#4 (0) {
    }
    }

    Actual result:
    --------------
    object(foo)#1 (2) {
    ["v1"]=>
    object(bar)#2 (0) {
    }
    ["v2"]=>
    object(bar)#2 (0) {
    }
    }
    object(foo)#3 (2) {
    ["v1"]=>
    object(bar)#4 (0) {
    }
    ["v2"]=>
    object(bar)#5 (0) {
    }
    }



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


    --
    Edit this bug report at [url]http://bugs.php.net/?id=25975&edit=1[/url]
    sniper@php.net Guest

  2. #2

    Default #25975 [Opn->Bgs]: PHP 5 object references don't survive serialization

    ID: 25975
    Updated by: [email]sniperphp.net[/email]
    Reported By: reiersol at online dot no
    -Status: Open
    +Status: Bogus
    Bug Type: Session related
    Operating System: Linux RedHat 9.0
    PHP Version: 5CVS-2003-10-24 (dev)
    New Comment:

    Still can't see what might be wrong here.
    The result you get is pretty much what I would expect to get..



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

    [2003-10-31 03:42:04] reiersol at online dot no

    I guess I'll have to expand my example:

    class Bar { var $value = 0; }
    class Foo {
    var $v1;
    var $v2;
    function Foo() {
    $this->v1 = new Bar;
    $this->v2 = $this->v1;
    }
    }

    $f = new Foo;
    $f->v2->value = 42;
    var_dump($f);
    $g = unserialize(serialize($f));
    $g->v2->value = 'and now for something completely different';
    var_dump($g);

    Here's the output:

    object(foo)#1 (2) {
    ["v1"]=>
    object(bar)#2 (1) {
    ["value"]=>
    int(42)
    }
    ["v2"]=>
    object(bar)#2 (1) {
    ["value"]=>
    int(42)
    }
    }
    object(foo)#3 (2) {
    ["v1"]=>
    object(bar)#4 (1) {
    ["value"]=>
    int(42)
    }
    ["v2"]=>
    object(bar)#5 (1) {
    ["value"]=>
    string(42) "and now for something completely different"
    }
    }

    That should at least make it clear that there's a difference in
    behavior before and after serialization. And the behavior before
    serialization is the behavior of a normal object-oriented language. (I
    ported the example to Java just to make sure I wasn't crazy.)

    I'm not trying to split hairs. I tried creating the kind of
    sophiticated object-oriented structure that PHP 5 makes so much easier.
    It worked wonderfully. But then I discovered that the structure didn't
    persist across sessions. So I made this simplified example to
    demonstrate the problem.

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

    [2003-10-30 20:59:30] [email]sniperphp.net[/email]

    There are no references in the before serialize object, so why should
    there be references after serializing/unserializing?


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

    [2003-10-24 08:11:44] reiersol at online dot no

    The last line of the code example (print $1) is meaningless. Sorry.

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

    [2003-10-24 08:08:59] reiersol at online dot no

    Description:
    ------------
    Object references inside PHP5 objects are not preserved through
    serialize/unserialize like traditional PHP4 references. This means they
    cannot be used in session-based applications.

    Reproduce code:
    ---------------
    class Bar {}
    class Foo {
    var $v1;
    var $v2;
    function Foo() {
    $this->v1 = new Bar;
    $this->v2 = $this->v1;
    }
    }

    $f = new Foo;
    var_dump($f);
    $g = unserialize(serialize($f));
    var_dump($g);
    print $s1;


    Expected result:
    ----------------
    This is what I get if I use $this->v2 = &this->$v1 instead of $this->v2
    = $this->v1:

    object(foo)#1 (2) {
    ["v1"]=>
    &object(bar)#2 (0) {
    }
    ["v2"]=>
    &object(bar)#2 (0) {
    }
    }
    object(foo)#3 (2) {
    ["v1"]=>
    &object(bar)#4 (0) {
    }
    ["v2"]=>
    &object(bar)#4 (0) {
    }
    }

    Actual result:
    --------------
    object(foo)#1 (2) {
    ["v1"]=>
    object(bar)#2 (0) {
    }
    ["v2"]=>
    object(bar)#2 (0) {
    }
    }
    object(foo)#3 (2) {
    ["v1"]=>
    object(bar)#4 (0) {
    }
    ["v2"]=>
    object(bar)#5 (0) {
    }
    }



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


    --
    Edit this bug report at [url]http://bugs.php.net/?id=25975&edit=1[/url]
    sniper@php.net Guest

  3. #3

    Default #25975 [Opn->Bgs]: PHP 5 object references don't survive serialization

    ID: 25975
    Updated by: [email]sniperphp.net[/email]
    Reported By: reiersol at online dot no
    -Status: Open
    +Status: Bogus
    Bug Type: Session related
    Operating System: Linux RedHat 9.0
    PHP Version: 5CVS-2003-10-24 (dev)
    New Comment:

    Why would it be same when you change the "contents" of the object after
    unserializing it? Still no bug.




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

    [2003-11-02 09:36:42] reiersol at online dot no

    I realized that an even better way to test this is to use the triple
    equals sign (see
    [url]http://no.php.net/manual/en/language.oop.object-comparison-php5.php):[/url]

    var_dump($f->v1 === $f->v2);
    var_dump($g->v1 === $g->v2);

    This outputs:

    bool(true)
    bool(false)

    Based on the manual, this should mean that the two members refer to the
    same instance of the same class before serialize/unserialize, but not
    after.

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

    [2003-11-01 14:04:48] cunha17 at uol dot com dot br

    C'mon sniper, just put
    $g = $f;
    instead of
    $g = unserialize(serialize($f));
    and you see that the result will be different, when, in fact, it
    shouldn't.
    That's definetly a bug.

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

    [2003-11-01 05:22:22] [email]sniperphp.net[/email]

    Still can't see what might be wrong here.
    The result you get is pretty much what I would expect to get..


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

    [2003-10-31 03:42:04] reiersol at online dot no

    I guess I'll have to expand my example:

    class Bar { var $value = 0; }
    class Foo {
    var $v1;
    var $v2;
    function Foo() {
    $this->v1 = new Bar;
    $this->v2 = $this->v1;
    }
    }

    $f = new Foo;
    $f->v2->value = 42;
    var_dump($f);
    $g = unserialize(serialize($f));
    $g->v2->value = 'and now for something completely different';
    var_dump($g);

    Here's the output:

    object(foo)#1 (2) {
    ["v1"]=>
    object(bar)#2 (1) {
    ["value"]=>
    int(42)
    }
    ["v2"]=>
    object(bar)#2 (1) {
    ["value"]=>
    int(42)
    }
    }
    object(foo)#3 (2) {
    ["v1"]=>
    object(bar)#4 (1) {
    ["value"]=>
    int(42)
    }
    ["v2"]=>
    object(bar)#5 (1) {
    ["value"]=>
    string(42) "and now for something completely different"
    }
    }

    That should at least make it clear that there's a difference in
    behavior before and after serialization. And the behavior before
    serialization is the behavior of a normal object-oriented language. (I
    ported the example to Java just to make sure I wasn't crazy.)

    I'm not trying to split hairs. I tried creating the kind of
    sophiticated object-oriented structure that PHP 5 makes so much easier.
    It worked wonderfully. But then I discovered that the structure didn't
    persist across sessions. So I made this simplified example to
    demonstrate the problem.

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

    [2003-10-30 20:59:30] [email]sniperphp.net[/email]

    There are no references in the before serialize object, so why should
    there be references after serializing/unserializing?


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

    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
    [url]http://bugs.php.net/25975[/url]

    --
    Edit this bug report at [url]http://bugs.php.net/?id=25975&edit=1[/url]
    sniper@php.net Guest

Similar Threads

  1. #25975 [Com]: PHP 5 object references don't survive serialization
    By cunha17 at uol dot com dot br in forum PHP Development
    Replies: 2
    Last Post: January 22nd, 01:22 AM
  2. #25975 [Opn->Fbk]: PHP 5 object references don't survive serialization
    By moriyoshi@php.net in forum PHP Development
    Replies: 2
    Last Post: December 31st, 01:15 AM
  3. #25975 [Bgs->Opn]: PHP 5 object references don't survive serialization
    By reiersol at online dot no in forum PHP Development
    Replies: 2
    Last Post: November 9th, 03:48 PM
  4. #25975 [Bgs]: PHP 5 object references don't survive serialization
    By sniper@php.net in forum PHP Development
    Replies: 1
    Last Post: November 4th, 06:25 AM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139