1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
2024-11-09 23:42:11 +03:00

182 lines
7.6 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 2d8559c6c0c10f677080b636bd67e54efdc2cf0a Maintainer: malferov Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="reflectionclass.newlazyproxy" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<refnamediv>
<refname>ReflectionClass::newLazyProxy</refname>
<refpurpose>Создает новый экземпляр ленивого прокси</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="ReflectionClass">
<modifier>public</modifier> <type>object</type><methodname>ReflectionClass::newLazyProxy</methodname>
<methodparam><type>callable</type><parameter>factory</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>options</parameter><initializer>0</initializer></methodparam>
</methodsynopsis>
<simpara>
Метод создаёт новый ленивый прокси-экземпляр класса и прикрепляет к ленивому прокси
фабричную callback-функцию <parameter>factory</parameter>. Конструктор не вызывается,
а свойствам не устанавливаются значения по умолчанию. При попытке
наблюдения или модификации состояния объекта-прокси в первый раз
вызывается фабричная функция, чтобы вернуть реальный экземпляр,
который затем прикрепляется к прокси. Взаимодействия с прокси
после этого этапа перенаправляются в реальный экземпляр. См. секции руководства
«<link linkend="language.oop5.lazy-objects.initialization-triggers">Триггеры инициализации</link>»
и «<link linkend="language.oop5.lazy-objects.initialization-sequence">Последовательность инициализации</link>».
</simpara>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>factory</parameter></term>
<listitem>
<simpara>
Фабрика — callback-функция со следующей сигнатурой:
</simpara>
<para>
<methodsynopsis>
<type>object</type><methodname><replaceable>factory</replaceable></methodname>
<methodparam><type>object</type><parameter>object</parameter></methodparam>
</methodsynopsis>
<variablelist>
<varlistentry>
<term><parameter>object</parameter></term>
<listitem>
<simpara>
Параметр <parameter>object</parameter> принимает объект инициализации. На этом этапе
объект перестаёт быть ленивым, а обращение к объекту не запускает
повторную инициализацию.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<simpara>
Функция фабрики должна возвращать объект, который называется
<emphasis>реальным экземпляром</emphasis> и который затем прикрепляется
к прокси. Реальному экземпляру нельзя быть ленивым и нельзя самому быть
прокси. Класс прокси должен принадлежать подклассу класса реального экземпляра
без дополнительных свойств и не должен переопределять метод
<methodname>__destruct</methodname> или <methodname>__clone</methodname>,
если реальный экземпляр не принадлежит типу того же класса, что и прокси.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('reflectionclass.newlazyghost.parameters.options')/*)">
<xi:fallback/>
</xi:include>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<simpara>
Метод возвращает экземпляр ленивого прокси. Метод возвращает стандартный, а не ленивый экземпляр,
если у объекта нет свойств или все свойства объекта статические или виртуальные.
Смотрите также описание, которое содержит секция
«<link linkend="language.oop5.lazy-objects.lifecycle">Жизненный цикл ленивых объектов</link>».
</simpara>
</refsect1>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('reflectionclass.newlazyghost')/db:refsect1[@role='errors'])">
<xi:fallback/>
</xi:include>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Базовый пример создания нового экземпляра ленивого прокси</title>
<programlisting role="php">
<![CDATA[
<?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);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
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)
}
}
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><link linkend="language.oop5.lazy-objects">Ленивые объекты</link></member>
<member><methodname>ReflectionClass::newLazyGhost</methodname></member>
<member><methodname>ReflectionClass::newInstanceWithoutConstructor</methodname></member>
<member><methodname>ReflectionClass::resetAsLazyProxy</methodname></member>
<member><methodname>ReflectionClass::markLazyObjectAsInitialized</methodname></member>
<member><methodname>ReflectionClass::initializeLazyObject</methodname></member>
<member><methodname>ReflectionClass::isUninitializedLazyObject</methodname></member>
<member><methodname>ReflectionProperty::setRawValueWithoutLazyInitialization</methodname></member>
<member><methodname>ReflectionProperty::skipLazyInitialization</methodname></member>
<member><methodname>ReflectionProperty::isLazy</methodname></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->