PHP.mk документација

Мрзливи објекти

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

language.oop5.lazy-objects.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека language.oop5.lazy-objects.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Мрзливи објекти

Референца за `language.oop5.lazy-objects.php` со подобрена типографија и навигација.

language.oop5.lazy-objects.php

Мрзливи објекти

A lazy object is an object whose initialization is deferred until its state is observed or modified. Some use-case examples include dependency injection components that provide lazy services fully initialized only if needed, ORMМрзливиот објект е објект чија иницијализација се одложува додека неговата состојба не се набљудува или менува. Некои примери за употреба вклучуваат компоненти за инјектирање зависности што обезбедуваат мрзливи услуги целосно иницијализирани само ако е потребно,

обезбедувајќи мрзливи ентитети што се хидрираат од базата на податоци само кога им се пристапува, или JSON парсер што го одложува парсирањето додека елементите не се пристапат.

Забелешка: Информации за верзија
Поддржани се две стратегии за мрзливи објекти: Ghost Objects и Virtual Proxies, отсега наречени „мрзливи духови“ и „мрзливи проксии“. Во двете стратегии, мрзливиот објект е прикачен на иницијализатор или фабрика што се повикува автоматски кога неговата состојба ќе се набљудува или менува за прв пат. Од гледна точка на апстракција, мрзливите објекти духови се нераспознатливи од не-мрзливите: тие можат да се користат без да се знае дека се мрзливи, дозволувајќи им да бидат предадени и користени од код што не е свесен за мрзеливоста. Мрзливите проксии се слично транспарентни, но мора да се внимава кога се користи нивниот идентитет, бидејќи проксито и неговата вистинска инстанца имаат различни идентитети.

Мрзливите објекти беа воведени во PHP 8.4.

Создавање мрзливи објекти stdClass Можно е да се создаде мрзлива инстанца на која било класа дефинирана од корисникот или на класа (други внатрешни класи не се поддржани), или да се ресетира инстанца на овие класи за да стане мрзлива. Влезните точки за создавање мрзлив објект се and ReflectionClass::newLazyGhost() methods.

ReflectionClass::newLazyProxy()

Двата методи прифаќаат функција што се повикува кога објектот бара иницијализација. Очекуваното однесување на функцијата варира во зависност од стратегијата што се користи, како што е опишано во референтната документација за секој метод.

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

$reflector = new ReflectionClass(Example::class);
$lazyObject = $reflector->newLazyGhost(function (Example $object) {
// Initialize object in-place
$object->__construct(1);
});

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

// Triggers initialization
var_dump($lazyObject->prop);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

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

Пример #1 Создавање мрзлив дух

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

$reflector = new ReflectionClass(Example::class);
$lazyObject = $reflector->newLazyProxy(function (Example $object) {
// Create and return the real instance
return new Example(1);
});

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

// Triggers initialization
var_dump($lazyObject->prop);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

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

Пример #2 Создавање мрзлив прокси ReflectionPropertyСекој пристап до својствата на мрзлив објект го активира неговото иницијализирање (вклучително и преку

). Сепак, одредени својства може да бидат познати однапред и не треба да активираат иницијализација кога им се пристапува:

<?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']);
});

// Without this line, the following call to ReflectionProperty::setValue() would
// trigger initialization.
$reflector->getProperty('id')->skipLazyInitialization($post);
$reflector->getProperty('id')->setValue($post, 123);

// Alternatively, one can use this directly:
$reflector->getProperty('id')->setRawValueWithoutLazyInitialization($post, 123);

// The id property can be accessed without triggering initialization
var_dump($post->id);
?>

На Пример #3 Иницијализирање својства однапред and ReflectionProperty::skipLazyInitialization() ReflectionProperty::setRawValueWithoutLazyInitialization()

методите нудат начини за заобиколување на мрзливото иницијализирање при пристап до својство.

За стратегиите за мрзливи објекти се објекти кои се иницијализираат на место и, откако ќе се иницијализираат, се неразлични од објект што никогаш не бил мрзлив. Оваа стратегија е погодна кога ја контролираме и инстанцирањето и иницијализацијата на објектот, што ја прави непогодна ако некоја од овие се управува од друга страна.

Мрзливи проксии, откако ќе се иницијализираат, дејствуваат како проксии до вистинска инстанца: секоја операција на иницијализиран мрзлив прокси се препраќа до вистинската инстанца. Создавањето на вистинската инстанца може да се делегира на друга страна, што ја прави оваа стратегија корисна во случаи кога мрзливите духови се непогодни. Иако мрзливите проксии се речиси исто толку транспарентни како мрзливите духови, потребна е претпазливост кога се користи нивниот идентитет, бидејќи проксито и неговата вистинска инстанца имаат различни идентитети.

Животен циклус на мрзливи објекти

Објектите можат да станат мрзливи при инстанцирање користејќи класа (други внатрешни класи не се поддржани), или да се ресетира инстанца на овие класи за да стане мрзлива. Влезните точки за создавање мрзлив објект се or ReflectionClass::newLazyGhost(), или по инстанцирање користејќи Мрзливиот објект е објект чија иницијализација се одложува додека неговата состојба не се набљудува или менува. Некои примери за употреба вклучуваат компоненти за инјектирање зависности кои обезбедуваат мрзливи услуги целосно иницијализирани само доколку е потребно, or ReflectionClass::resetAsLazyGhost(). По ова, мрзлив објект може да се иницијализира преку една од следниве операции:

. Бидејќи мрзливите објекти се иницијализираат кога сите нивни својства се означени како не-мрзливи, горните методи нема да означат објект како мрзлив ако ниту едно својство не може да се означи како мрзливо.

Предизвикувачи на иницијализација

Мрзливите објекти се дизајнирани да бидат целосно транспарентни за нивните потрошувачи, така што нормалните операции што ги набљудуваат или менуваат состојбата на објектот автоматски ќе предизвикаат иницијализација пред да се изврши операцијата. Ова вклучува, но не е ограничено на, следниве операции:

Повиците на методите што не пристапуваат до состојбата на објектот нема да предизвикаат иницијализација. Слично на тоа, интеракциите со објектот што повикуваат магични методи или функции за закачување нема да предизвикаат иницијализација ако овие методи или функции не пристапуваат до состојбата на објектот.

Операции што не предизвикуваат активирање

Следниве специфични методи или операции на ниско ниво овозможуваат пристап или модификација на мрзливи објекти без да предизвикаат иницијализација:

Секвенца на иницијализација

Овој дел ги опишува операциите што се извршуваат кога ќе се активира иницијализацијата, врз основа на стратегијата што се користи.

Ghost објекти

  • Објектот е означен како не-мрзлив.
  • Својствата што не се иницијализирани со Пример #3 Иницијализирање својства однапред or ReflectionProperty::skipLazyInitialization() се поставуваат на нивните стандардни вредности, доколку ги има. Во оваа фаза, објектот наликува на оној создаден со (PHP 5 >= 5.1.3, PHP 7, PHP 8), освен за веќе иницијализираните својства.
  • Потоа се повикува функцијата за иницијализација со објектот како прв параметар. Се очекува функцијата, но не е задолжително, да ја иницијализира состојбата на објектот и мора да врати null или никаква вредност. Објектот во овој момент повеќе не е мрзлив, така што функцијата може директно да пристапи до неговите својства.

По иницијализацијата, објектот е нераспознатлив од објект што никогаш не бил мрзлив.

Proxy објекти

  • Објектот е означен како не-мрзлив.
  • За разлика од ghost објектите, својствата на објектот не се менуваат во оваа фаза.
  • Функцијата за фабрика се повикува со објектот како прв параметар и мора да врати не-мрзлива инстанца на компатибилна класа (види ReflectionClass::newLazyGhost()).
  • ReflectionObject::__toString() вратениот примерок се нарекува вистински примерок
  • и е прикачен на проксито. unset() беше повикана.

Вредностите на својствата на проксито се отфрлаат како да Пример #3 Иницијализирање својства однапред or ReflectionProperty::skipLazyInitialization().

По иницијализацијата, пристапот до која било својство на проксито ќе даде ист резултат како пристапот до соодветното својство на вистинскиот примерок; сите пристапи до својства на проксито се препраќаат до вистинскиот примерок, вклучувајќи ги декларираните, динамичките, непостоечките или својствата означени со not Самиот прокси објект е

заменет или супституиран за вистинскиот примерок.

Вообичаено однесување

Опсегот и $this контекстот на иницијализаторот или фабричката функција остануваат непроменети, и се применуваат вообичаените ограничувања за видливост.

По успешна иницијализација, иницијализаторот или фабричката функција веќе не се реферираат од објектот и може да бидат ослободени ако немаат други референци.

Ако иницијализаторот фрли исклучок, состојбата на објектот се враќа на состојбата пред иницијализација и објектот повторно се означува како мрзлив. Со други зборови, сите ефекти врз самиот објект се враќаат. Други странични ефекти, како што се ефекти врз други објекти, не се враќаат. Ова спречува изложување на делумно иницијализирана инстанца во случај на неуспех.

Клонирање

Клонирање мрзлив објект ја активира својата иницијализација пред да се создаде клонот, што резултира со иницијализиран објект.

За прокси објекти, се клонираат и проксито и неговата вистинска инстанца, и се враќа клонот на проксито. На __clone методот се повикува на вистинската инстанца, а не на проксито. Клонираното прокси и вистинската инстанца се поврзани како што се за време на иницијализацијата, така што пристапите до клонот на проксито се препраќаат до клонот на вистинската инстанца.

Ова однесување осигурува дека клонот и оригиналниот објект одржуваат одделни состојби. Промените на оригиналниот објект или состојбата на неговиот иницијализатор по клонирањето не влијаат на клонот. Клонирањето и на проксито и на неговата вистинска инстанца, наместо враќање само на клонот на вистинската инстанца, осигурува дека операцијата за клонирање доследно враќа објект од истата класа.

Деструктори

За мрзливи духови, деструкторот се повикува само ако објектот е иницијализиран. За прокси, деструкторот се повикува само на вистинската инстанца, ако постои.

На Мрзливиот објект е објект чија иницијализација се одложува додека неговата состојба не се набљудува или менува. Некои примери за употреба вклучуваат компоненти за инјектирање зависности кои обезбедуваат мрзливи услуги целосно иницијализирани само доколку е потребно, and ReflectionClass::resetAsLazyGhost() методите може да го повикаат деструкторот на објектот што се ресетира.

Белешки од корисници

Нема белешки од корисници за оваа страница.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.