1--TEST--
2Lazy objects: Conversion to array
3--FILE--
4<?php
5
6class C {
7    public int $a;
8    public $b;
9
10    public function __construct() {
11        $this->a = 1;
12        $this->b = 2;
13    }
14}
15
16function test(string $name, object $obj) {
17    printf("# %s\n", $name);
18
19    $reflector = new ReflectionClass(C::class);
20    $reflector->getProperty('a')->setRawValueWithoutLazyInitialization($obj, 3);
21
22    $a = [];
23    // Converts $obj to array internally
24    array_splice($a, 0, 0, $obj);
25    var_dump($a, $obj);
26
27    $reflector->initializeLazyObject($obj);
28
29    $a = [];
30    array_splice($a, 0, 0, $obj);
31    var_dump($a, $obj);
32}
33
34$reflector = new ReflectionClass(C::class);
35$obj = $reflector->newLazyGhost(function ($obj) {
36    $obj->__construct();
37});
38
39test('Ghost', $obj);
40
41$obj = $reflector->newLazyProxy(function () {
42    return new C();
43});
44
45test('Proxy', $obj);
46
47?>
48--EXPECTF--
49# Ghost
50array(1) {
51  [0]=>
52  int(3)
53}
54lazy ghost object(C)#%d (1) {
55  ["a"]=>
56  int(3)
57}
58array(2) {
59  [0]=>
60  int(1)
61  [1]=>
62  int(2)
63}
64object(C)#%d (2) {
65  ["a"]=>
66  int(1)
67  ["b"]=>
68  int(2)
69}
70# Proxy
71array(1) {
72  [0]=>
73  int(3)
74}
75lazy proxy object(C)#%d (1) {
76  ["a"]=>
77  int(3)
78}
79array(2) {
80  [0]=>
81  int(1)
82  [1]=>
83  int(2)
84}
85lazy proxy object(C)#%d (1) {
86  ["instance"]=>
87  object(C)#%d (2) {
88    ["a"]=>
89    int(1)
90    ["b"]=>
91    int(2)
92  }
93}
94