PHPKonf 2025 Baku

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, инициализация ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ откладываСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π½Π°Ρ‡Π½Ρ‘Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π½Π΅ измСнится состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚: Π°) ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ внСдрСния зависимостСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ слуТбы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° 100 % Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π±) ORM-инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³ΠΈΠ΄Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ значСниями ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ORM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ»ΠΈ Π²) JSON-парсСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊ элСмСнтам Π½Π΅ обратятся.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π²Π΅ стратСгии Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈ (Π°Π½Π³Π». Ghost Objects) ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ прокси (Π°Π½Π³Π». Virtual Proxies), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ здСсь ΠΈ дальшС Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Β«Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈΒ» ΠΈ Β«Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ прокси». Π’ ΠΎΠ±Π΅ΠΈΡ… стратСгиях Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прикрСпляСтся ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΈΠ»ΠΈ Ρ„Π°Π±Ρ€ΠΈΠΊΠ΅, которая вызываСтся автоматичСски, ΠΊΠΎΠ³Π΄Π° состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния абстракции Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈ Π½Π΅ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΌΡ‹ ΠΎΡ‚ Π½Π΅Π»Π΅Π½ΠΈΠ²Ρ‹Ρ…: с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Π½Π΅ зная, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠ΄Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π΅Π· знания ΠΎ Π»Π΅Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ прокси Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° потрСбуСтся ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-прокси ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра, ΡΠΎΠ±Π»ΡŽΠ΄Π°ΡŽΡ‚ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-прокси ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: БвСдСния ΠΎ вСрсии
Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ прСдставлСны Π² PHP 8.4.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ экзСмпляры ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классов ΠΈΠ»ΠΈ стандартного PHP-класса stdClass (Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ) ΠΈΠ»ΠΈ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ экзСмпляры этих классов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ. Π’ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, β€” ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ReflectionClass::newLazyGhost() ΠΈ ReflectionClass::newLazyProxy().

Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая вызываСтся, ΠΊΠΎΠ³Π΄Π° трСбуСтся инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ПовСдСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΆΠ΄ΡƒΡ‚ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, мСняСтся, ΠΈ зависит ΠΎΡ‚ стратСгии. Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ описываСт справочная докумСнтация ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠ°

<?php

class Example
{
public function
__construct(public int $prop)
{
echo
__METHOD__, "\n";
}
}

$reflector = new ReflectionClass(Example::class);
$lazyObject = $reflector->newLazyGhost(function (Example $object) {
// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ·ΠΆΠ΅, Π½Π° мСстС β€” ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ
$object->__construct(1);
});

var_dump($lazyObject);
var_dump(get_class($lazyObject));

// ЗапускаСм ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ
var_dump($lazyObject->prop);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

lazy ghost object(Example)#3 (0) {
["prop"]=>
uninitialized(int)
}
string(7) "Example"
Example::__construct
int(1)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ прокси

<?php

class Example
{
public function
__construct(public int $prop)
{
echo
__METHOD__, "\n";
}
}

$reflector = new ReflectionClass(Example::class);
$lazyObject = $reflector->newLazyProxy(function (Example $object) {
// Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр
return new Example(1);
});

var_dump($lazyObject);
var_dump(get_class($lazyObject));

// ЗапускаСм ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ
var_dump($lazyObject->prop);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

lazy proxy object(Example)#3 (0) {
  ["prop"]=>
  uninitialized(int)
}
string(7) "Example"
Example::__construct
int(1)

Доступ ΠΊ свойствам Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° запускаСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ доступ Ρ‡Π΅Ρ€Π΅Π· класс ReflectionProperty. Однако ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства ΠΈΠ½ΠΎΠ³Π΄Π° извСстны Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΈ трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ доступС:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ энСргичной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ свойств

<?php

class BlogPost
{
public function
__construct(
public
int $id,
public
string $title,
public
string $content,
) {}
}

$reflector = new ReflectionClass(BlogPost::class);

$post = $reflector->newLazyGhost(function ($post) {
$data = fetch_from_store($post->id);
$post->__construct($data['id'], $data['title'], $data['content']);
});

// Π‘Π΅Π· этой строки Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ReflectionProperty::setValue(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ΄Ρ‘Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ,
// запустит ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ
$reflector->getProperty('id')->skipLazyInitialization($post);

$reflector->getProperty('id')->setValue($post, 123);

// ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ установки значСния свойства Π±Π΅Π· запуска Π»Π΅Π½ΠΈΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
$reflector->getProperty('id')->setRawValueWithoutLazyInitialization($post, 123);

// Доступ ΠΊ свойству id Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π±Π΅Π· запуска ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
var_dump($post->id);

?>

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ReflectionProperty::skipLazyInitialization() ΠΈ ReflectionProperty::setRawValueWithoutLazyInitialization() ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ способы ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ доступС ΠΊ свойству.

О стратСгиях Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° мСстС, ΠΈ послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΌΡ‹ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π» Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ. Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ созданиС экзСмпляра, Ρ‚Π°ΠΊ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ Π½Π΅ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΉ, Ссли хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих процСссов управляСтся Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороной.

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ прокси послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ прокси Π΄ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра: ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π»Π΅Π½ΠΈΠ²ΠΎΠΌ прокси ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сторонС, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ эту ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈ Π½Π΅ подходят. Π₯отя Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ прокси ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹, ΠΊΠ°ΠΊ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈ, потрСбуСтся ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° потрСбуСтся ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ прокси ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-прокси ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.

Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌΠΈ Π»ΠΈΠ±ΠΎ сразу β€” ΠΏΡƒΡ‚Ρ‘ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ReflectionClass::newLazyGhost() ΠΈΠ»ΠΈ ReflectionClass::newLazyProxy(), Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ ReflectionClass::resetAsLazyGhost() ΠΈΠ»ΠΈ ReflectionClass::resetAsLazyProxy(). Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ становятся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ свойство Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Π½Π΅Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ помСтят ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ, Ссли Π½ΠΈ ΠΎΠ΄Π½ΠΎ свойство нСльзя ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ.

Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ спроСктировали Π½Π° 100 % ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ для ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ, поэтому ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, автоматичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ запускаСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

  • Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись свойства.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° установки свойства ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ свойства.
  • Доступ ΠΊ свойству ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ свойства ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ReflectionProperty::getValue(), ReflectionProperty::getRawValue(), ReflectionProperty::setValue() ΠΈΠ»ΠΈ ReflectionProperty::setRawValue().
  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка свойств ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ReflectionObject::getProperties() ΠΈΠ»ΠΈ ReflectionObject::getProperty(), ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ get_object_vars().
  • Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ свойствам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Iterator ΠΈΠ»ΠΈ IteratorAggregate, конструкциСй foreach.
  • БСриализация Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° функциями serialize(), json_encode() ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.
  • ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Аналогично, взаимодСйствия с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ магичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ…ΡƒΠΊΠ°, Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ссли для этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ доступ ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

НСтриггСрныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π΅Π· запуска ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π Π°Π·Π΄Π΅Π» описываСт Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ для стратСгий ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ запускС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΈ

  • Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊ помСчаСтся ΠΊΠ°ΠΊ Π½Π΅Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ.
  • Бвойствам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ReflectionProperty::skipLazyInitialization() ΠΈΠ»ΠΈ ReflectionProperty::setRawValueWithoutLazyInitialization(), ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² классС. На этом этапС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создали ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ReflectionClass::newInstanceWithoutConstructor(), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ.
  • Π—Π°Ρ‚Π΅ΠΌ вызываСтся callback-функция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° β€” хотя это ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ β€” ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ null ΠΈΠ»ΠΈ Π½Π΅ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния. На этом этапС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСстаёт Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ, поэтому функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ прямой доступ ΠΊ свойствам Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΌ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π» Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-прокси

  • Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ прокси помСчаСтся ΠΊΠ°ΠΊ Π½Π΅Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ.
  • Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΎΠ², свойства Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… прокси Π½Π° этом этапС Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.
  • Ѐабричная callback-функция вызываСтся с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ экзСмпляр совмСстимого класса. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ описаниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ReflectionClass::newLazyProxy().
  • ЭкзСмпляр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½ΡƒΠ»Π° функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, называСтся Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ экзСмпляром ΠΈ прикрСпляСтся ΠΊ прокси.
  • ЗначСния свойств Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ прокси ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ ΡΠ·Ρ‹ΠΊΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ unset().

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ доступ ΠΊ свойствам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-прокси даст Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ доступ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ свойству Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра; обращСния ΠΊ свойствам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-прокси ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅, динамичСскиС, Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ свойства ΠΈΠ»ΠΈ свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ReflectionProperty::skipLazyInitialization() ΠΈΠ»ΠΈ ReflectionProperty::setRawValueWithoutLazyInitialization().

Π‘Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-прокси Π½Π΅ замСняСтся ΠΈ Π½Π΅ подмСняСт собой Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр.

Π₯отя Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ прокси ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, оТидаСтся, Ρ‡Ρ‚ΠΎ фабричная функция Π½Π΅ станСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-прокси. ИзмСнСния Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ, Π½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ Π½Π° Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ этапС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Однако прокси ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° основС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… свойств, класса, самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. НапримСр, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ создаёт Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр Π½Π° основС значСния ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ свойства.

ΠžΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠžΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΈ контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $this ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ стандартныС ограничСния видимости.

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ большС Π½Π΅ ссылаСтся Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ доступСн для освобоТдСния, Ссли Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ссылок.

БостояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° возвращаСтся ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ снова помСчаСтся ΠΊΠ°ΠΊ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ, Ссли ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ воздСйствиС Π½Π° сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отмСняСтся. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ воздСйствия Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΠΎΡ‚ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ прСдоставлСниС частично ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ экзСмпляра ΠΏΡ€ΠΈ ошибкС.

ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° запускаСт Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ создаётся ΠΊΠ»ΠΎΠ½, поэтому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся.

ΠŸΡ€ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-прокси клонируСтся ΠΊΠ°ΠΊ прокси, Ρ‚Π°ΠΊ ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр, ΠΈ возвращаСтся ΠΊΠ»ΠΎΠ½ прокси. ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ __clone вызываСтся Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ экзСмплярС, Π½Π΅ Π½Π° прокси. ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ прокси ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ связались ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, поэтому доступ ΠΊ ΠΊΠ»ΠΎΠ½Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-прокси пСрСнаправляСтся Π½Π° ΠΊΠ»ΠΎΠ½ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра.

Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΎΠ½ ΠΈ исходный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ состояния. ИзмСнСния состояния исходного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ состояния Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° послС клонирования Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΊΠ»ΠΎΠ½. ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ прокси, ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра вмСсто Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΠΎΠ½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ опСрация клонирования ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса.

ДСструкторы

Для Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ·Ρ€Π°ΠΊΠΎΠ² дСструктор вызываСтся, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ. Для прокси дСструктор вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ экзСмпляра, Ссли Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр сущСствуСт.

ΠœΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ReflectionClass::resetAsLazyGhost() ΠΈ ReflectionClass::resetAsLazyProxy() Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ дСструктор сбрасываСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

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

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

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