2 changed files with 170 additions and 0 deletions
@ -0,0 +1,115 @@ |
|||
--TEST-- |
|||
Bug #29493 (extract(EXTR_REFS) fails if array has multiple referrals) |
|||
--FILE-- |
|||
<?php |
|||
function t1() |
|||
{ |
|||
$a = array('foo' => 'aaa'); |
|||
// refcount($a) = 1 |
|||
// refcount($a['foo']) = 1 |
|||
$b = $a; |
|||
// refcount($a) = 2 |
|||
// refcount($a['foo']) = 1 |
|||
$b['foo'] = 'bbb'; |
|||
// refcount($a) = 1 |
|||
// refcount($a['foo']) = 1 |
|||
|
|||
var_dump($a, $b); |
|||
|
|||
extract($a, EXTR_REFS); |
|||
|
|||
$foo = 'noo'; |
|||
|
|||
var_dump($a, $b); |
|||
} |
|||
|
|||
function t2() |
|||
{ |
|||
$a = array('foo' => 'aaa'); |
|||
// refcount($a) = 1 |
|||
// refcount($a['foo']) = 1 |
|||
$b = &$a; |
|||
// refcount($a) = 2 |
|||
// is_ref($a) = true |
|||
// refcount($a['foo']) = 1 |
|||
$b['foo'] = 'bbb'; |
|||
// refcount($a) = 2 |
|||
// refcount($a['foo']) = 1 |
|||
|
|||
var_dump($a, $b); |
|||
|
|||
extract($a, EXTR_REFS); |
|||
|
|||
$foo = 'noo'; |
|||
|
|||
var_dump($a, $b); |
|||
} |
|||
|
|||
function t3() |
|||
{ |
|||
$a = array('foo' => 'aaa'); |
|||
// refcount($a) = 1 |
|||
// refcount($a['foo']) = 1 |
|||
$b = &$a; |
|||
// refcount($a) = 2 |
|||
// is_ref($a) = true |
|||
// refcount($a['foo']) = 1 |
|||
unset($b); |
|||
// refcount($a) = 1 |
|||
// is_ref($a) = true |
|||
// refcount($a['foo']) = 1 |
|||
|
|||
var_dump($a); |
|||
|
|||
extract($a, EXTR_REFS); |
|||
|
|||
$foo = 'noo'; |
|||
|
|||
var_dump($a); |
|||
} |
|||
|
|||
t1(); |
|||
t2(); |
|||
t3(); |
|||
?> |
|||
--EXPECT-- |
|||
array(1) { |
|||
["foo"]=> |
|||
string(3) "aaa" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
string(3) "bbb" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
&string(3) "noo" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
string(3) "bbb" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
string(3) "bbb" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
string(3) "bbb" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
&string(3) "noo" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
&string(3) "noo" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
string(3) "aaa" |
|||
} |
|||
array(1) { |
|||
["foo"]=> |
|||
&string(3) "noo" |
|||
} |
|||
@ -0,0 +1,55 @@ |
|||
--TEST-- |
|||
Bug #31213 (Sideeffects caused by bug #29493) |
|||
--FILE-- |
|||
<?php |
|||
function test($use_extract) { |
|||
$a = 1; |
|||
$b = 1; |
|||
|
|||
$arr = array( |
|||
'_a' => $a, |
|||
'_b' => &$b |
|||
); |
|||
|
|||
var_dump($a, $b); |
|||
|
|||
if ($use_extract) { |
|||
extract($arr, EXTR_REFS); |
|||
} else { |
|||
$_a = &$arr['_a']; |
|||
$_b = &$arr['_b']; |
|||
} |
|||
|
|||
$_a++; |
|||
$_b++; |
|||
|
|||
var_dump($a, $b, $_a, $_b, $arr); |
|||
} |
|||
|
|||
test(false); |
|||
test(true); |
|||
--EXPECT-- |
|||
int(1) |
|||
int(1) |
|||
int(1) |
|||
int(2) |
|||
int(2) |
|||
int(2) |
|||
array(2) { |
|||
["_a"]=> |
|||
&int(2) |
|||
["_b"]=> |
|||
&int(2) |
|||
} |
|||
int(1) |
|||
int(1) |
|||
int(1) |
|||
int(2) |
|||
int(2) |
|||
int(2) |
|||
array(2) { |
|||
["_a"]=> |
|||
&int(2) |
|||
["_b"]=> |
|||
&int(2) |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue