File tree Expand file tree Collapse file tree 1 file changed +111
-0
lines changed
Expand file tree Collapse file tree 1 file changed +111
-0
lines changed Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments