# ZE2 race condition

- Thread: https://externals.io/message/269
- Original archive: https://news-web.php.net/php.internals/269
- Started by Jan Schneider on 2003-03-25T14:13:07+00:00
- Messages: 2
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #269 — Jan Schneider — 2003-03-25T14:13:07+00:00

URL: https://externals.io/message/269#269

Running the following code:

class Foo {
  var $bar_ref;
}

class Bar {
  var $foo_ref;
}

$foo = new Foo();
$bar = new Bar();
$foo->bar_ref = $bar;
$bar->foo_ref = $foo;

var_dump($foo);
var_dump($bar);

$s = serialize($foo);
var_dump($s);
$s = serialize($bar);
var_dump($s);


in PHP_4_3 results to:

object(foo)(1) {
  ["bar_ref"]=>
  object(bar)(1) {
    ["foo_ref"]=>
    `NULL` 
  }
}
object(bar)(1) {
  ["foo_ref"]=>
  object(foo)(1) {
    ["bar_ref"]=>
    object(bar)(1) {
      ["foo_ref"]=>
      `NULL` 
    }
  }
}
string(58) "O:3:"foo":1:{s:7:"bar_ref";O:3:"bar":1:{s:7:"foo_ref";N;}}"
string(86)
"O:3:"bar":1:{s:7:"foo_ref";O:3:"foo":1:{s:7:"bar_ref";O:3:"bar":1:{s:7:"foo_ref";N;}}}"


in HEAD:

object(foo)#1 (1) {
  ["bar_ref"]=>
  object(bar)#2 (1) {
    ["foo_ref"]=>
    object(foo)#1 (1) {
      ["bar_ref"]=>
      object(bar)#2 (1) {
        ["foo_ref"]=>
        *RECURSION*
      }
    }
  }
}
object(bar)#2 (1) {
  ["foo_ref"]=>
  object(foo)#1 (1) {
    ["bar_ref"]=>
    object(bar)#2 (1) {
      ["foo_ref"]=>
      object(foo)#1 (1) {
        ["bar_ref"]=>
        *RECURSION*
      }
    }
  }
}

and a segfault (apache 1 sapi) or a runaway process (cli sapi).

Jan.

--
http://www.horde.org - The Horde Project
http://www.ammma.de - discover your knowledge
http://www.tip4all.de - Deine private Tippgemeinschaft

---

## #290 — Zeev Suraski — 2003-03-26T01:52:32+00:00

URL: https://externals.io/message/269#290 · In reply to: #269

That's quite intentional - assignments in ZE2 are handle based, versus the 
value based in ZE1.  That's more or less the biggest change in ZE2 :)

If you want to create copies like in ZE1 you can use __clone().

Zeev

At 06:13 25/03/2003, Jan Schneider wrote:
>Running the following code:
>
>class Foo {
>   var $bar_ref;
>}
>
>class Bar {
>   var $foo_ref;
>}
>
>$foo = new Foo();
>$bar = new Bar();
>$foo->bar_ref = $bar;
>$bar->foo_ref = $foo;
>
>var_dump($foo);
>var_dump($bar);
>
>$s = serialize($foo);
>var_dump($s);
>$s = serialize($bar);
>var_dump($s);
>
>
>in PHP_4_3 results to:
>
>object(foo)(1) {
>   ["bar_ref"]=>
>   object(bar)(1) {
>     ["foo_ref"]=>
>     `NULL` 
>   }
>}
>object(bar)(1) {
>   ["foo_ref"]=>
>   object(foo)(1) {
>     ["bar_ref"]=>
>     object(bar)(1) {
>       ["foo_ref"]=>
>       `NULL` 
>     }
>   }
>}
>string(58) "O:3:"foo":1:{s:7:"bar_ref";O:3:"bar":1:{s:7:"foo_ref";N;}}"
>string(86)
>"O:3:"bar":1:{s:7:"foo_ref";O:3:"foo":1:{s:7:"bar_ref";O:3:"bar":1:{s:7:"foo_ref";N;}}}"
>
>
>in HEAD:
>
>object(foo)#1 (1) {
>   ["bar_ref"]=>
>   object(bar)#2 (1) {
>     ["foo_ref"]=>
>     object(foo)#1 (1) {
>       ["bar_ref"]=>
>       object(bar)#2 (1) {
>         ["foo_ref"]=>
>         *RECURSION*
>       }
>     }
>   }
>}
>object(bar)#2 (1) {
>   ["foo_ref"]=>
>   object(foo)#1 (1) {
>     ["bar_ref"]=>
>     object(bar)#2 (1) {
>       ["foo_ref"]=>
>       object(foo)#1 (1) {
>         ["bar_ref"]=>
>         *RECURSION*
>       }
>     }
>   }
>}
>
>and a segfault (apache 1 sapi) or a runaway process (cli sapi).
>
>Jan.
>
>--
>http://www.horde.org - The Horde Project
>http://www.ammma.de - discover your knowledge
>http://www.tip4all.de - Deine private Tippgemeinschaft
