1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
--TEST--
Lazy objects: resetAsLazy*() preserves readonly semantics
--FILE--
<?php
class B {
public readonly int $a;
public readonly int $b;
public int $c;
public function __construct($value, bool $setB = false) {
try {
$this->a = $value;
} catch (\Error $e) {
printf("%s: %s\n", $e::class, $e->getMessage());
}
if ($setB) {
$this->b = $value;
}
try {
$this->c = $value;
} catch (\Error $e) {
printf("%s: %s\n", $e::class, $e->getMessage());
}
}
}
final class C extends B {
}
function test(string $name, object $obj) {
printf("# %s\n", $name);
$reflector = new ReflectionClass($obj::class);
$reflector->resetAsLazyGhost($obj, function ($obj) {
$obj->__construct(2, setB: true);
});
$reflector->initializeLazyObject($obj);
var_dump($obj);
}
$obj = new B(1);
test('B', $obj);
$obj = new C(1);
test('C', $obj);
--EXPECTF--
# B
object(B)#%d (3) {
["a"]=>
int(2)
["b"]=>
int(2)
["c"]=>
int(2)
}
# C
Error: Cannot modify readonly property B::$a
object(C)#%d (3) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(2)
}
|