1--TEST--
2Readonly variations
3--FILE--
4<?php
5
6class Test {
7    public readonly int $prop;
8    public readonly array $array;
9
10    public function init() {
11        $this->prop = 1;
12        $this->array = [];
13    }
14
15    public function r() {
16        echo $this->prop;
17    }
18
19    public function w() {
20        $this->prop = 1;
21        echo 'done';
22    }
23
24    public function rw() {
25        $this->prop += 1;
26        echo 'done';
27    }
28
29    public function im() {
30        $this->prop[] = 1;
31        echo 'done';
32    }
33
34    public function is() {
35        echo (int) isset($this->prop);
36    }
37
38    public function us() {
39        unset($this->prop);
40        echo 'done';
41    }
42
43    public function us_dim() {
44        unset($this->array[0]);
45        echo 'done';
46    }
47}
48
49function r($test) {
50    echo $test->prop;
51}
52
53function w($test) {
54    $test->prop = 0;
55    echo 'done';
56}
57
58function rw($test) {
59    $test->prop += 1;
60    echo 'done';
61}
62
63function im($test) {
64    $test->prop[] = 1;
65    echo 'done';
66}
67
68function is($test) {
69    echo (int) isset($test->prop);
70}
71
72function us($test) {
73    unset($test->prop);
74    echo 'done';
75}
76
77function us_dim($test) {
78    unset($test->array[0]);
79    echo 'done';
80}
81
82foreach ([true, false] as $init) {
83    foreach ([true, false] as $scope) {
84        foreach (['r', 'w', 'rw', 'im', 'is', 'us', 'us_dim'] as $op) {
85            $test = new Test();
86            if ($init) {
87                $test->init();
88            }
89
90            echo 'Init: ' . ((int) $init) . ', scope: ' . ((int) $scope) . ', op: ' . $op . ": ";
91            try {
92                if ($scope) {
93                    $test->{$op}();
94                } else {
95                    $op($test);
96                }
97            } catch (Error $e) {
98                echo $e->getMessage();
99            }
100            echo "\n";
101        }
102    }
103}
104
105?>
106--EXPECT--
107Init: 1, scope: 1, op: r: 1
108Init: 1, scope: 1, op: w: Cannot modify readonly property Test::$prop
109Init: 1, scope: 1, op: rw: Cannot modify readonly property Test::$prop
110Init: 1, scope: 1, op: im: Cannot indirectly modify readonly property Test::$prop
111Init: 1, scope: 1, op: is: 1
112Init: 1, scope: 1, op: us: Cannot unset readonly property Test::$prop
113Init: 1, scope: 1, op: us_dim: Cannot indirectly modify readonly property Test::$array
114Init: 1, scope: 0, op: r: 1
115Init: 1, scope: 0, op: w: Cannot modify readonly property Test::$prop
116Init: 1, scope: 0, op: rw: Cannot modify readonly property Test::$prop
117Init: 1, scope: 0, op: im: Cannot indirectly modify readonly property Test::$prop
118Init: 1, scope: 0, op: is: 1
119Init: 1, scope: 0, op: us: Cannot unset readonly property Test::$prop
120Init: 1, scope: 0, op: us_dim: Cannot indirectly modify readonly property Test::$array
121Init: 0, scope: 1, op: r: Typed property Test::$prop must not be accessed before initialization
122Init: 0, scope: 1, op: w: done
123Init: 0, scope: 1, op: rw: Typed property Test::$prop must not be accessed before initialization
124Init: 0, scope: 1, op: im: Cannot indirectly modify readonly property Test::$prop
125Init: 0, scope: 1, op: is: 0
126Init: 0, scope: 1, op: us: done
127Init: 0, scope: 1, op: us_dim: done
128Init: 0, scope: 0, op: r: Typed property Test::$prop must not be accessed before initialization
129Init: 0, scope: 0, op: w: Cannot modify protected(set) readonly property Test::$prop from global scope
130Init: 0, scope: 0, op: rw: Typed property Test::$prop must not be accessed before initialization
131Init: 0, scope: 0, op: im: Cannot indirectly modify readonly property Test::$prop
132Init: 0, scope: 0, op: is: 0
133Init: 0, scope: 0, op: us: Cannot unset protected(set) readonly property Test::$prop from global scope
134Init: 0, scope: 0, op: us_dim: done
135