(PHP 8 >= 8.4.0)
ReflectionClass::markLazyObjectAsInitialized β ΠΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π»Π΅Π½ΠΈΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π±Π΅Π· Π²ΡΠ·ΠΎΠ²Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΈΠ»ΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ
ΠΠ΅ΡΠΎΠ΄ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π»Π΅Π½ΠΈΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π±Π΅Π· Π²ΡΠ·ΠΎΠ²Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ°
ΠΈΠ»ΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ. ΠΠ΅ΡΠΎΠ΄ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ, Π΅ΡΠ»ΠΈ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ object ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ Π½Π΅ Π»Π΅Π½ΠΈΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ.
ΠΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ΅ ΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ β Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π»Π΅Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° object β
ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΠΈΡ
Β«ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈΒ»
Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²-ΠΏΡΠΈΠ·ΡΠ°ΠΊΠΎΠ²,
Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ.
ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅ΠΎΡΠ»ΠΈΡΠΈΠΌ ΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ» Π»Π΅Π½ΠΈΠ²ΡΠΌ
ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ
ReflectionClass::newInstanceWithoutConstructor(),
Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ²ΠΎΠΉΡΡΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ
ReflectionProperty::setRawValueWithoutLazyInitialization()
ΠΈΠ»ΠΈ ReflectionProperty::skipLazyInitialization().
object
ΠΠ΅ΡΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ object, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
ΠΏΠΎΠΌΠ΅ΡΠΈΠ» ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΌΠ΅ΡΠΊΠΈ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ
<?php
class Example
{
public string $prop1;
public string $prop2;
public string $prop3 = 'default value';
}
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost(function ($object) {
echo "Initializer called\n";
$object->prop1 = 'initialized';
});
$reflector->getProperty('prop1')
->setRawValueWithoutLazyInitialization($object, 'prop1 value');
var_dump($object);
$reflector->markLazyObjectAsInitialized($object);
var_dump($object);
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
lazy ghost object(Example)#3 (1) {
["prop1"]=>
string(11) "prop1 value"
["prop2"]=>
uninitialized(string)
["prop3"]=>
uninitialized(string)
}
object(Example)#3 (2) {
["prop1"]=>
string(11) "prop1 value"
["prop2"]=>
uninitialized(string)
["prop3"]=>
string(13) "default value"
}
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΌΠ΅ΡΠΊΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ
<?php
class Example
{
public string $prop1;
public string $prop2;
public string $prop3 = 'default value';
}
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost(function ($object) {
echo "Initializer called\n";
$object->prop1 = 'initialized';
});
$reflector->getProperty('prop1')
->setRawValueWithoutLazyInitialization($object, 'prop1 value')
;
var_dump($object->prop3);
var_dump($object);
$reflector->markLazyObjectAsInitialized($object);
var_dump($object);
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
Initializer called
string(13) "default value"
object(Example)#3 (2) {
["prop1"]=>
string(11) "initialized"
["prop2"]=>
uninitialized(string)
["prop3"]=>
string(13) "default value"
}
object(Example)#3 (2) {
["prop1"]=>
string(11) "initialized"
["prop2"]=>
uninitialized(string)
["prop3"]=>
string(13) "default value"
}