1--TEST--
2ZE2 ArrayAccess and ArrayReferenceProxy with references
3--FILE--
4<?php
5
6// NOTE: This will become part of SPL
7
8class ArrayReferenceProxy implements ArrayAccess
9{
10	private $object;
11	private $element;
12
13	function __construct(ArrayAccess $object, array &$element)
14	{
15		echo __METHOD__ . "($element)\n";
16		$this->object = $object;
17		$this->element = &$element;
18	}
19
20	function offsetExists($index) {
21		echo __METHOD__ . "($this->element, $index)\n";
22		return array_key_exists($index, $this->element);
23	}
24
25	function offsetGet($index) {
26		echo __METHOD__ . "($this->element, $index)\n";
27		return isset($this->element[$index]) ? $this->element[$index] : NULL;
28	}
29
30	function offsetSet($index, $value) {
31		echo __METHOD__ . "($this->element, $index, $value)\n";
32		$this->element[$index] = $value;
33	}
34
35	function offsetUnset($index) {
36		echo __METHOD__ . "($this->element, $index)\n";
37		unset($this->element[$index]);
38	}
39}
40
41class Peoples implements ArrayAccess
42{
43	public $person;
44
45	function __construct()
46	{
47		$this->person = array(array('name'=>'Foo'));
48	}
49
50	function offsetExists($index)
51	{
52		return array_key_exists($index, $this->person);
53	}
54
55	function offsetGet($index)
56	{
57		return new ArrayReferenceProxy($this, $this->person[$index]);
58	}
59
60	function offsetSet($index, $value)
61	{
62		$this->person[$index] = $value;
63	}
64
65	function offsetUnset($index)
66	{
67		unset($this->person[$index]);
68	}
69}
70
71$people = new Peoples;
72
73var_dump($people->person[0]['name']);
74$people->person[0]['name'] = $people->person[0]['name'] . 'Bar';
75var_dump($people->person[0]['name']);
76$people->person[0]['name'] .= 'Baz';
77var_dump($people->person[0]['name']);
78
79echo "===ArrayOverloading===\n";
80
81$people = new Peoples;
82
83var_dump($people[0]);
84var_dump($people[0]['name']);
85$people[0]['name'] = 'FooBar';
86var_dump($people[0]['name']);
87$people[0]['name'] = $people->person[0]['name'] . 'Bar';
88var_dump($people[0]['name']);
89$people[0]['name'] .= 'Baz';
90var_dump($people[0]['name']);
91unset($people[0]['name']);
92var_dump($people[0]);
93var_dump($people[0]['name']);
94$people[0]['name'] = 'BlaBla';
95var_dump($people[0]['name']);
96
97?>
98===DONE===
99<?php exit(0); ?>
100--EXPECTF--
101string(3) "Foo"
102string(6) "FooBar"
103string(9) "FooBarBaz"
104===ArrayOverloading===
105ArrayReferenceProxy::__construct(Array)
106object(ArrayReferenceProxy)#%d (2) {
107  ["object":"ArrayReferenceProxy":private]=>
108  object(Peoples)#%d (1) {
109    ["person"]=>
110    array(1) {
111      [0]=>
112      &array(1) {
113        ["name"]=>
114        string(3) "Foo"
115      }
116    }
117  }
118  ["element":"ArrayReferenceProxy":private]=>
119  &array(1) {
120    ["name"]=>
121    string(3) "Foo"
122  }
123}
124ArrayReferenceProxy::__construct(Array)
125ArrayReferenceProxy::offsetGet(Array, name)
126string(3) "Foo"
127ArrayReferenceProxy::__construct(Array)
128ArrayReferenceProxy::offsetSet(Array, name, FooBar)
129ArrayReferenceProxy::__construct(Array)
130ArrayReferenceProxy::offsetGet(Array, name)
131string(6) "FooBar"
132ArrayReferenceProxy::__construct(Array)
133ArrayReferenceProxy::offsetSet(Array, name, FooBarBar)
134ArrayReferenceProxy::__construct(Array)
135ArrayReferenceProxy::offsetGet(Array, name)
136string(9) "FooBarBar"
137ArrayReferenceProxy::__construct(Array)
138ArrayReferenceProxy::offsetGet(Array, name)
139ArrayReferenceProxy::offsetSet(Array, name, FooBarBarBaz)
140ArrayReferenceProxy::__construct(Array)
141ArrayReferenceProxy::offsetGet(Array, name)
142string(12) "FooBarBarBaz"
143ArrayReferenceProxy::__construct(Array)
144ArrayReferenceProxy::offsetUnset(Array, name)
145ArrayReferenceProxy::__construct(Array)
146object(ArrayReferenceProxy)#%d (2) {
147  ["object":"ArrayReferenceProxy":private]=>
148  object(Peoples)#%d (1) {
149    ["person"]=>
150    array(1) {
151      [0]=>
152      &array(0) {
153      }
154    }
155  }
156  ["element":"ArrayReferenceProxy":private]=>
157  &array(0) {
158  }
159}
160ArrayReferenceProxy::__construct(Array)
161ArrayReferenceProxy::offsetGet(Array, name)
162NULL
163ArrayReferenceProxy::__construct(Array)
164ArrayReferenceProxy::offsetSet(Array, name, BlaBla)
165ArrayReferenceProxy::__construct(Array)
166ArrayReferenceProxy::offsetGet(Array, name)
167string(6) "BlaBla"
168===DONE===
169