1--TEST-- 2Lazy objects: property fetch coalesce on non existing property initializes object 3--FILE-- 4<?php 5 6class C { 7 public int $a = 1; 8 public function __construct() { 9 var_dump(__METHOD__); 10 } 11} 12 13function test(string $name, object $obj) { 14 printf("# %s:\n", $name); 15 16 var_dump($obj); 17 var_dump($obj->unknown ?? null); 18 var_dump($obj); 19} 20 21$reflector = new ReflectionClass(C::class); 22 23$obj = $reflector->newLazyGhost(function ($obj) { 24 var_dump("initializer"); 25 $obj->__construct(); 26}); 27 28test('Ghost', $obj); 29 30$obj = $reflector->newLazyProxy(function ($obj) { 31 var_dump("initializer"); 32 return new C(); 33}); 34 35test('Proxy', $obj); 36--EXPECTF-- 37# Ghost: 38lazy ghost object(C)#%d (0) { 39 ["a"]=> 40 uninitialized(int) 41} 42string(11) "initializer" 43string(14) "C::__construct" 44NULL 45object(C)#%d (1) { 46 ["a"]=> 47 int(1) 48} 49# Proxy: 50lazy proxy object(C)#%d (0) { 51 ["a"]=> 52 uninitialized(int) 53} 54string(11) "initializer" 55string(14) "C::__construct" 56NULL 57lazy proxy object(C)#%d (1) { 58 ["instance"]=> 59 object(C)#%d (1) { 60 ["a"]=> 61 int(1) 62 } 63} 64