ID: 35277
Comment by: sveta at microbecal dot com
Reported By: [email]lsmith@php.net[/email]
Status: Suspended
Bug Type: Arrays related
Operating System: *
PHP Version: 6CVS, 5CVS
Assigned To: dmitry
New Comment:

Seems this bug affects comparision of objects which contains references
to themself:

$cat >comparision.php
<?php

class A{
private $a;

public function __construct()
{
$this->a = $this;
}
}

$a = array(new A, 1);
$b = array(new A, 1);

var_dump($a == $b);

?>
^C

$php comparision.php

Fatal error: Nesting level too deep - recursive dependency? in
/users/ssmirnova/comparision.php on line 15


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

[2005-11-18 16:16:40] [email]dmitry@php.net[/email]

The reason of this bug is IS_CV variables.
PHP doesn't increment/decrement refcount during fetching, also the
order of fetches may be changed. In 5.1 and lvalue of "$a[] = $a" is
evaluated before rvalue and changes rvalue (addes new element to
array). Then $a is assigned into this element. As a result we got
circular data structure where we shouldn't.

The same bug occurs with list()

Reproduce code:
---------------
<?php
$b = array("1","2","3");
list($a, $b, $c) = $b;
var_dump($a); //should print "1" (not "2")
var_dump($b);
var_dump($c);
$b = array("1","2","3");
list($a, $b[0], $c) = $b;
var_dump($a); //should print "1" (not "2")
var_dump($b);
var_dump($c);
?>

Expected result:
----------------
string(1) "1"
string(1) "2"
string(1) "3"
string(1) "1"
array(3) {
[0]=>
string(1) "2"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
string(1) "3"

Actual result:
--------------
string(1) "2"
string(1) "2"
string(1) "3"
string(1) "2"
array(3) {
[0]=>
string(1) "2"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
string(1) "3"


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

[2005-11-18 15:39:56] [email]lsmith@php.net[/email]

Description:
------------
PHP 5.1.0 seems to be overly paranoid when trying to detect a
recursion. I do not know the internals but I do not think this is a
duplicate of [url]http://bugs.php.net/bug.php?id=29389[/url].

Reproduce code:
---------------
$a = array(); $a[] = $a; var_dump($a);

Expected result:
----------------
array(1) { [0]=> array(0) { } }

Actual result:
--------------
array(1) { [0]=> array(1) { [0]=> *RECURSION* } }


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


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