Skip to content

Commit 0c2ed9e

Browse files
committed
Add test for ArrayAccess
1 parent 349484a commit 0c2ed9e

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
--TEST--
2+
Data classes implementing ArrayAccess
3+
--FILE--
4+
<?php
5+
6+
abstract class VectorBase implements ArrayAccess {
7+
public $elements;
8+
9+
public function offsetExists(mixed $offset): bool {
10+
return array_key_exists($offset, $this->elements);
11+
}
12+
13+
public function offsetSet(mixed $offset, mixed $value): void {
14+
if ($offset) {
15+
$this->elements[$offset] = $value;
16+
} else {
17+
$this->elements[] = $value;
18+
}
19+
}
20+
21+
public function offsetUnset(mixed $offset): void {
22+
unset($this->elements[$offset]);
23+
}
24+
}
25+
26+
data class VectorByVal extends VectorBase {
27+
public function offsetGet(mixed $offset): mixed {
28+
return $this->elements[$offset];
29+
}
30+
}
31+
32+
data class VectorByRef extends VectorBase {
33+
public function &offsetGet(mixed $offset): mixed {
34+
return $this->elements[$offset];
35+
}
36+
}
37+
38+
data class Box {
39+
public function __construct(
40+
public int $value,
41+
) {}
42+
43+
public mutating function inc() {
44+
$this->value++;
45+
}
46+
}
47+
48+
$box = new Box(1);
49+
50+
$vec = new VectorByVal();
51+
$vec[] = $box;
52+
$vec[0]->value = 2;
53+
var_dump($vec);
54+
$vec[0]->inc!();
55+
var_dump($vec);
56+
57+
$vec = new VectorByRef();
58+
$vec[] = $box;
59+
$vec[0]->value = 2;
60+
var_dump($vec);
61+
$vec[0]->inc!();
62+
var_dump($vec);
63+
64+
var_dump($box);
65+
66+
?>
67+
--EXPECT--
68+
object(VectorByVal)#2 (1) {
69+
["elements"]=>
70+
array(1) {
71+
[0]=>
72+
object(Box)#1 (1) {
73+
["value"]=>
74+
int(1)
75+
}
76+
}
77+
}
78+
object(VectorByVal)#2 (1) {
79+
["elements"]=>
80+
array(1) {
81+
[0]=>
82+
object(Box)#1 (1) {
83+
["value"]=>
84+
int(1)
85+
}
86+
}
87+
}
88+
object(VectorByRef)#3 (1) {
89+
["elements"]=>
90+
array(1) {
91+
[0]=>
92+
object(Box)#2 (1) {
93+
["value"]=>
94+
int(2)
95+
}
96+
}
97+
}
98+
object(VectorByRef)#3 (1) {
99+
["elements"]=>
100+
array(1) {
101+
[0]=>
102+
object(Box)#2 (1) {
103+
["value"]=>
104+
int(3)
105+
}
106+
}
107+
}
108+
object(Box)#1 (1) {
109+
["value"]=>
110+
int(1)
111+
}

0 commit comments

Comments
 (0)