1--TEST--
2Check behaviour of incomplete class
3--FILE--
4<?php
5$serialized = 'O:1:"C":1:{s:1:"p";i:1;}';
6
7$incomplete = unserialize($serialized);
8eval('#[AllowDynamicProperties] Class C {}');
9$complete   = unserialize($serialized);
10
11
12echo "\n\n---> Various types of access on complete class:\n" ;
13var_dump($complete);
14var_dump(is_object($complete));
15var_dump($complete->p);
16
17$ref1 = "ref1.original";
18$complete->p = &$ref1;
19var_dump($complete->p);
20$ref1 = "ref1.changed";
21var_dump($complete->p);
22$complete->p = "p.changed";
23var_dump($ref1);
24
25var_dump(isset($complete->x));
26$complete->x = "x.new";
27var_dump(isset($complete->x));
28unset($complete->x);
29var_dump($complete->x);
30
31
32echo "\n\n---> Same types of access on incomplete class:\n" ;
33var_dump($incomplete);
34var_dump(is_object($incomplete));
35var_dump($incomplete->p);
36
37try {
38    $ref2 = "ref1.original";
39    $incomplete->p = &$ref2;
40} catch (Error $e) {
41    echo $e->getMessage(), "\n";
42}
43var_dump($incomplete->p);
44$ref2 = "ref1.changed";
45var_dump($incomplete->p);
46try {
47    $incomplete->p = "p.changed";
48} catch (Error $e) {
49    echo $e->getMessage(), "\n";
50}
51var_dump($ref1);
52
53var_dump(isset($incomplete->x));
54try {
55    $incomplete->x = "x.new";
56} catch (Error $e) {
57    echo $e->getMessage(), "\n";
58}
59var_dump(isset($incomplete->x));
60try {
61    unset($incomplete->x);
62} catch (Error $e) {
63    echo $e->getMessage(), "\n";
64}
65var_dump($incomplete->x);
66
67try {
68    $incomplete->f();
69} catch (Error $e) {
70    echo $e->getMessage(), "\n";
71}
72
73echo "Done";
74?>
75--EXPECTF--
76---> Various types of access on complete class:
77object(C)#%d (1) {
78  ["p"]=>
79  int(1)
80}
81bool(true)
82int(1)
83string(13) "ref1.original"
84string(12) "ref1.changed"
85string(9) "p.changed"
86bool(false)
87bool(true)
88
89Warning: Undefined property: C::$x in %s on line %d
90NULL
91
92
93---> Same types of access on incomplete class:
94object(__PHP_Incomplete_Class)#%d (2) {
95  ["__PHP_Incomplete_Class_Name"]=>
96  string(1) "C"
97  ["p"]=>
98  int(1)
99}
100bool(true)
101
102Warning: main(): The script tried to access a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
103NULL
104The script tried to modify a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
105
106Warning: main(): The script tried to access a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
107NULL
108
109Warning: main(): The script tried to access a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
110NULL
111The script tried to modify a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
112string(9) "p.changed"
113
114Warning: main(): The script tried to access a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
115bool(false)
116The script tried to modify a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
117
118Warning: main(): The script tried to access a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
119bool(false)
120The script tried to modify a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
121
122Warning: main(): The script tried to access a property on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
123NULL
124The script tried to call a method on an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
125Done
126