1--TEST--
2Evaluation order during assignments.
3--FILE--
4<?php
5
6function f() {
7    echo "in f()\n";
8    return "name";
9}
10
11function g() {
12    echo "in g()\n";
13    return "assigned value";
14}
15
16
17echo "\n\nOrder with local assignment:\n";
18${f()} = g();
19var_dump($name);
20
21echo "\n\nOrder with array assignment:\n";
22$a[f()] = g();
23var_dump($a);
24
25echo "\n\nOrder with object property assignment:\n";
26$oa = new stdClass;
27$oa->${f()} = g();
28var_dump($oa);
29
30echo "\n\nOrder with nested object property assignment:\n";
31$ob = new stdClass;
32$ob->o1 = new stdClass;
33$ob->o1->o2 = new stdClass;
34$ob->o1->o2->${f()} = g();
35var_dump($ob);
36
37echo "\n\nOrder with dim_list property assignment:\n";
38$oc = new stdClass;
39$oc->a[${f()}] = g();
40var_dump($oc);
41
42
43class C {
44    public static $name = "original";
45    public static $a = array();
46    public static $string = "hello";
47}
48echo "\n\nOrder with static property assignment:\n";
49C::${f()} = g();
50var_dump(C::$name);
51
52echo "\n\nOrder with static array property assignment:\n";
53C::$a[f()] = g();
54var_dump(C::$a);
55
56echo "\n\nOrder with indexed string assignment:\n";
57$string = "hello";
58function getOffset() {
59    echo "in getOffset()\n";
60    return 0;
61}
62function newChar() {
63    echo "in newChar()\n";
64    return 'j';
65}
66$string[getOffset()] = newChar();
67var_dump($string);
68
69echo "\n\nOrder with static string property assignment:\n";
70C::$string[getOffset()] = newChar();
71var_dump(C::$string);
72
73?>
74--EXPECTF--
75Order with local assignment:
76in f()
77in g()
78string(14) "assigned value"
79
80
81Order with array assignment:
82in f()
83in g()
84array(1) {
85  ["name"]=>
86  string(14) "assigned value"
87}
88
89
90Order with object property assignment:
91in f()
92in g()
93object(stdClass)#%d (1) {
94  ["assigned value"]=>
95  string(14) "assigned value"
96}
97
98
99Order with nested object property assignment:
100in f()
101in g()
102object(stdClass)#%d (1) {
103  ["o1"]=>
104  object(stdClass)#%d (1) {
105    ["o2"]=>
106    object(stdClass)#%d (1) {
107      ["assigned value"]=>
108      string(14) "assigned value"
109    }
110  }
111}
112
113
114Order with dim_list property assignment:
115in f()
116in g()
117object(stdClass)#%d (1) {
118  ["a"]=>
119  array(1) {
120    ["assigned value"]=>
121    string(14) "assigned value"
122  }
123}
124
125
126Order with static property assignment:
127in f()
128in g()
129string(14) "assigned value"
130
131
132Order with static array property assignment:
133in f()
134in g()
135array(1) {
136  ["name"]=>
137  string(14) "assigned value"
138}
139
140
141Order with indexed string assignment:
142in getOffset()
143in newChar()
144string(5) "jello"
145
146
147Order with static string property assignment:
148in getOffset()
149in newChar()
150string(5) "jello"
151