(PHP 8 >= 8.4.0)
ReflectionClass::newLazyProxy β Π‘ΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠΊΡΠΈ
ΠΠ΅ΡΠΎΠ΄ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ Π»Π΅Π½ΠΈΠ²ΡΠΉ ΠΏΡΠΎΠΊΡΠΈ-ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ΅Ρ ΠΊ Π»Π΅Π½ΠΈΠ²ΠΎΠΌΡ ΠΏΡΠΎΠΊΡΠΈ
ΡΠ°Π±ΡΠΈΡΠ½ΡΡ callback-ΡΡΠ½ΠΊΡΠΈΡ factory. ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ,
Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅
Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°-ΠΏΡΠΎΠΊΡΠΈ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·
Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π±ΡΠΈΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ Π²Π΅ΡΠ½ΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ,
ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ΅ΡΡΡ ΠΊ ΠΏΡΠΎΠΊΡΠΈ. ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΏΡΠΎΠΊΡΠΈ
ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ° ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ. Π‘ΠΌ. ΡΠ΅ΠΊΡΠΈΠΈ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°
Β«Π’ΡΠΈΠ³Π³Π΅ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈΒ»
ΠΈ Β«ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈΒ».
factory
objectobject ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅
ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ Π±ΡΡΡ Π»Π΅Π½ΠΈΠ²ΡΠΌ, Π° ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ
ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
options
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ options ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΠ»Π°Π³ΠΎΠ²:
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
ΠΠ΅ΡΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠΊΡΠΈ. ΠΠ΅ΡΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ, Π° Π½Π΅ Π»Π΅Π½ΠΈΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, Π΅ΡΠ»ΠΈ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅Ρ ΡΠ²ΠΎΠΉΡΡΠ² ΠΈΠ»ΠΈ Π²ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠ»ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅. Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅ΠΊΡΠΈΡ Β«ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» Π»Π΅Π½ΠΈΠ²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²Β».
ΠΠ΅ΡΠΎΠ΄ Π²ΡΠ±ΡΠΎΡΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ Error, Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌ ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΈΡΡΠ΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡ, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π½Π΅ ΠΊΠ»Π°ΡΡ stdClass.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠΊΡΠΈ
<?php
class Example
{
public function __construct(public int $prop)
{
echo __METHOD__, "\n";
}
}
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyProxy(function (Example $object) {
$realInstance = new Example(1);
return $realInstance;
});
var_dump($object);
var_dump($object instanceof Example);
// ΠΠ°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Ρ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
var_dump($object->prop);
var_dump($object);
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
lazy proxy object(Example)#3 (0) {
["prop"]=>
uninitialized(int)
}
bool(true)
Example::__construct
int(1)
lazy proxy object(Example)#3 (1) {
["instance"]=>
object(Example)#4 (1) {
["prop"]=>
int(1)
}
}