xref: /PHP-8.0/ext/standard/tests/array/bug25708.phpt (revision f8d79582)
1--TEST--
2Bug #25708 (extract($GLOBALS, EXTR_REFS) mangles $GLOBALS)
3--FILE--
4<?php
5function foo($ref, $alt) {
6    unset($GLOBALS['a']);
7    unset($GLOBALS['b']);
8    $GLOBALS['a'] = 1;
9    $GLOBALS['b'] = 2;
10
11    $org_a = $GLOBALS['a'];
12    $org_b = $GLOBALS['b'];
13
14    if ($ref) {
15        global $a, $b;
16    } else {
17        /* zval temp_var(NULL); // refcount = 1
18         * a = temp_var[x] // refcount = 2
19         */
20        $a = NULL;
21        $b = NULL;
22    }
23
24    debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
25    echo "--\n";
26    if ($alt) {
27        $a = &$GLOBALS['a'];
28        $b = &$GLOBALS['b'];
29    } else {
30        extract($GLOBALS, EXTR_REFS);
31    }
32    debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
33    echo "--\n";
34    $a = &$GLOBALS['a'];
35    $b = &$GLOBALS['b'];
36    debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
37    echo "--\n";
38    $GLOBALS['b'] = 3;
39    debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
40    echo "--\n";
41    $a = 4;
42    debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
43    echo "--\n";
44    $c = $b;
45    debug_zval_dump($b, $GLOBALS['b'], $c);
46    echo "--\n";
47    $b = 'x';
48    debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b'], $c);
49    echo "--\n";
50    debug_zval_dump($org_a, $org_b);
51    echo "----";
52    if ($ref) echo 'r';
53    if ($alt) echo 'a';
54    echo "\n";
55}
56
57$a = 'ok';
58$b = 'ok';
59$_a = $a;
60$_b = $b;
61
62foo(false, true);
63foo(true, true);
64foo(false, false);
65foo(true, false);
66
67debug_zval_dump($_a, $_b);
68?>
69--EXPECTF--
70NULL
71NULL
72int(1)
73int(2)
74--
75int(1)
76int(2)
77int(1)
78int(2)
79--
80int(1)
81int(2)
82int(1)
83int(2)
84--
85int(1)
86int(3)
87int(1)
88int(3)
89--
90int(4)
91int(3)
92int(4)
93int(3)
94--
95int(3)
96int(3)
97int(3)
98--
99int(4)
100string(1) "x" refcount(%d)
101int(4)
102string(1) "x" refcount(%d)
103int(3)
104--
105int(1)
106int(2)
107----a
108int(1)
109int(2)
110int(1)
111int(2)
112--
113int(1)
114int(2)
115int(1)
116int(2)
117--
118int(1)
119int(2)
120int(1)
121int(2)
122--
123int(1)
124int(3)
125int(1)
126int(3)
127--
128int(4)
129int(3)
130int(4)
131int(3)
132--
133int(3)
134int(3)
135int(3)
136--
137int(4)
138string(1) "x" refcount(%d)
139int(4)
140string(1) "x" refcount(%d)
141int(3)
142--
143int(1)
144int(2)
145----ra
146NULL
147NULL
148int(1)
149int(2)
150--
151int(1)
152int(2)
153int(1)
154int(2)
155--
156int(1)
157int(2)
158int(1)
159int(2)
160--
161int(1)
162int(3)
163int(1)
164int(3)
165--
166int(4)
167int(3)
168int(4)
169int(3)
170--
171int(3)
172int(3)
173int(3)
174--
175int(4)
176string(1) "x" refcount(%d)
177int(4)
178string(1) "x" refcount(%d)
179int(3)
180--
181int(1)
182int(2)
183----
184int(1)
185int(2)
186int(1)
187int(2)
188--
189int(1)
190int(2)
191int(1)
192int(2)
193--
194int(1)
195int(2)
196int(1)
197int(2)
198--
199int(1)
200int(3)
201int(1)
202int(3)
203--
204int(4)
205int(3)
206int(4)
207int(3)
208--
209int(3)
210int(3)
211int(3)
212--
213int(4)
214string(1) "x" refcount(%d)
215int(4)
216string(1) "x" refcount(%d)
217int(3)
218--
219int(1)
220int(2)
221----r
222string(2) "ok" refcount(%d)
223string(2) "ok" refcount(%d)
224