ReflectionClass::newLazyProxy

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyProxy β€” Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ прокси

ОписаниС

public function ReflectionClass::newLazyProxy(callable $factory, int $options = 0): object

ΠœΠ΅Ρ‚ΠΎΠ΄ создаёт Π½ΠΎΠ²Ρ‹ΠΉ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ прокси-экзСмпляр класса ΠΈ прикрСпляСт ΠΊ Π»Π΅Π½ΠΈΠ²ΠΎΠΌΡƒ прокси Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΡƒΡŽ callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ factory. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Π½Π΅ вызываСтся, Π° свойствам Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ наблюдСния ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-прокси Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· вызываСтся фабричная функция, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ прикрСпляСтся ΠΊ прокси. ВзаимодСйствия с прокси послС этого этапа ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр. Π‘ΠΌ. сСкции руководства Β«Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΒ» ΠΈ Β«ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΒ».

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

factory
Π€Π°Π±Ρ€ΠΈΠΊΠ° β€” callback-функция со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сигнатурой:

function factory(object $object): object
object
ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ object ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. На этом этапС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСстаёт Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ, Π° ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π½Π΅ запускаСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.
Ѐункция Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ экзСмпляром ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ прикрСпляСтся ΠΊ прокси. Π Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ экзСмпляру нСльзя Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ ΠΈ нСльзя самому Π±Ρ‹Ρ‚ΡŒ прокси. Класс прокси Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ подклассу класса Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… свойств ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ __destruct() ΠΈΠ»ΠΈ __clone(), Ссли Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΈΠΏΡƒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса, Ρ‡Ρ‚ΠΎ ΠΈ прокси.
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)
  }
}

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы