<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'language.oop5.lazy-objects.php',
    1 => 'Objetos Lentos',
    2 => 'Objetos Lentos',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classes e Objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.variance.php',
    1 => 'Covari&acirc;ncia e Contravari&acirc;ncia',
  ),
  'next' => 
  array (
    0 => 'language.oop5.changelog.php',
    1 => 'Lista de altera&ccedil;&otilde;es da POO',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'language/oop5/lazy-objects.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.lazy-objects" class="sect1">
 <h2 class="title">Objetos Lentos</h2>

 <p class="simpara">
  Um objeto lento é um objeto cuja inicialização é adiada até que seu
  estado seja observado ou modificado. Alguns exemplos de casos de uso incluem componentes
  de injeção de dependência que fornecem serviços lentos totalmente inicializados somente se
  necessário, <abbr>ORM</abbr>s fornecendo entidades lentas que se
  hidratam do banco de dados somente quando acessados, ou um analisador JSON que
  atrasa a análise até que os elementos sejam acessados.
 </p>

 <p class="simpara">
  Duas estratégias de objetos lentos são suportadas: Objetos Fantasmas e Proxies
  Virtuais, doravante denominados &quot;fantasmas lentos&quot; e
  &quot;proxies lentos&quot;.
  Em ambas as estratégias, o objeto lento é anexado a um inicializador ou fábrica
  que é chamado automaticamente quando seu estado é observado ou modificado pela
  primeira vez. Do ponto de vista da abstração, os objetos fantasmas lentos são
  indistinguíveis dos não-lentos: eles podem ser usados ​​sem que se saiba que são
  lentos, permitindo que sejam passados ​​e usados ​​por códigos que desconhecem a
  lentidão. Os proxies lentos são igualmente transparentes, mas deve-se ter cuidado ao
  usar sua identidade, pois o proxy e sua instância real possuem identidades
  diferentes.
 </p>

 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <strong>Informação de Versão</strong><br />
  <span class="simpara">
   Objetos Lentos foram introduzidos no PHP 8.4.
  </span>
 </p></blockquote>

 <div class="sect2" id="language.oop5.lazy-objects.creation">
  <h3 class="title">Criando Objetos Lentos</h3>

  <p class="simpara">
   É possível criar uma instância lenta de qualquer classe definida pelo usuário ou da
   classe <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span> (outras classes internas não são
   suportadas), ou redefinir uma instância dessas classes para torná-la lenta.
   Os pontos de entrada para criar um objeto lento são os métodos
   <span class="methodname"><a href="reflectionclass.newlazyghost.php" class="methodname">ReflectionClass::newLazyGhost()</a></span> e
   <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>.
  </p>

  <p class="simpara">
   Ambos os métodos aceitam uma função que é chamada quando o objeto requer
   inicialização. O comportamento esperado da função varia dependendo da
   estratégia em uso, conforme descrito na documentação de referência de cada método.
  </p>

  <div class="example" id="example-1">
   <p><strong>Exemplo #1 Criando um Fantasma Lento</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(public </span><span style="color: #0000BB">int $prop</span><span style="color: #007700">)<br />    {<br />        echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$reflector </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionClass</span><span style="color: #007700">(</span><span style="color: #0000BB">Example</span><span style="color: #007700">::class);<br /></span><span style="color: #0000BB">$lazyObject </span><span style="color: #007700">= </span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">newLazyGhost</span><span style="color: #007700">(function (</span><span style="color: #0000BB">Example $object</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Inicializa o objeto no local<br />    </span><span style="color: #0000BB">$object</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />});<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$lazyObject</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$lazyObject</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Dispara a inicialização<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$lazyObject</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>O exemplo acima produzirá:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
lazy ghost object(Example)#3 (0) {
[&quot;prop&quot;]=&gt;
uninitialized(int)
}
string(7) &quot;Example&quot;
Example::__construct
int(1)
</pre></div>
   </div>
  </div>

  <div class="example" id="example-2">
   <p><strong>Exemplo #2 Criando um Proxy Lento</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(public </span><span style="color: #0000BB">int $prop</span><span style="color: #007700">)<br />    {<br />        echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$reflector </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionClass</span><span style="color: #007700">(</span><span style="color: #0000BB">Example</span><span style="color: #007700">::class);<br /></span><span style="color: #0000BB">$lazyObject </span><span style="color: #007700">= </span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">newLazyProxy</span><span style="color: #007700">(function (</span><span style="color: #0000BB">Example $object</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Cria e retorna a instância real<br />    </span><span style="color: #007700">return new </span><span style="color: #0000BB">Example</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />});<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$lazyObject</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$lazyObject</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Dispara a inicialização<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$lazyObject</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>O exemplo acima produzirá:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
lazy proxy object(Example)#3 (0) {
  [&quot;prop&quot;]=&gt;
  uninitialized(int)
}
string(7) &quot;Example&quot;
Example::__construct
int(1)
</pre></div>
   </div>
  </div>

  <p class="simpara">
   Qualquer acesso às propriedades de um objeto lento aciona sua inicialização
   (inclusive via <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span>).
   No entanto, certas propriedades podem ser conhecidas antecipadamente e não devem acionar
   a inicialização quando acessadas:
  </p>

  <div class="example" id="example-3">
   <p><strong>Exemplo #3 Inicializando Propriedades Ansiosamente</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">BlogPost<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(<br />        public </span><span style="color: #0000BB">int $id</span><span style="color: #007700">,<br />        public </span><span style="color: #0000BB">string $title</span><span style="color: #007700">,<br />        public </span><span style="color: #0000BB">string $content</span><span style="color: #007700">,<br />    ) { }<br />}<br /><br /></span><span style="color: #0000BB">$reflector </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionClass</span><span style="color: #007700">(</span><span style="color: #0000BB">BlogPost</span><span style="color: #007700">::class);<br /><br /></span><span style="color: #0000BB">$post </span><span style="color: #007700">= </span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">newLazyGhost</span><span style="color: #007700">(function (</span><span style="color: #0000BB">$post</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">fetch_from_store</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">], </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'title'</span><span style="color: #007700">], </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'content'</span><span style="color: #007700">]);<br />});<br /><br /></span><span style="color: #FF8000">// Sem esta linha, a seguinte chamada a ReflectionProperty::setValue()<br />// acionaria a inicialização.<br /></span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getProperty</span><span style="color: #007700">(</span><span style="color: #DD0000">'id'</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">skipLazyInitialization</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getProperty</span><span style="color: #007700">(</span><span style="color: #DD0000">'id'</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">setValue</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">, </span><span style="color: #0000BB">123</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Alternativamente, pode-se usar isso diretamente:<br /></span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getProperty</span><span style="color: #007700">(</span><span style="color: #DD0000">'id'</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">setRawValueWithoutLazyInitialization</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">, </span><span style="color: #0000BB">123</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// A propriedade id pode ser acessada sem acionar a inicialização<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="simpara">
   Os métodos <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span> e
   <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>
   oferecem maneiras de contornar a inicialização lenta ao acessar uma propriedade.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.patterns">
  <h3 class="title">Sobre Estratégias de Objetos Lentos</h3>

  <p class="simpara">
   <em>Fantasmas lentos</em> são objetos que se inicializam no local e,
   uma vez inicializados, são indistinguíveis de um objeto que nunca foi lento.
   Esta estratégia é adequada quando são controladas tanto a instanciação quanto a
   inicialização do objeto, tornando-a inadequada se qualquer um deles for
   gerenciado por outra parte.
  </p>

  <p class="simpara">
   <em>Proxies lentos</em>, uma vez inicializados, atuam como proxies para
   uma instância real: qualquer operação em um proxy lento inicializado é encaminhada
   para a instância real. A criação da instância real pode ser delegada
   a outra parte, tornando esta estratégia útil nos casos em que fantasmas lentos
   são inadequados. Embora os proxies lentos sejam quase tão transparentes quanto os fantasmas
   lentos, é necessário cautela quando sua identidade é usada, pois o proxy
   e sua instância real possuem identidades distintas.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.lifecycle">
  <h3 class="title">Ciclo de Vida de Objetos Lentos</h3>

  <p class="simpara">
   Os objetos podem se tornar lentos no momento da instanciação usando
   <span class="methodname"><a href="reflectionclass.newlazyghost.php" class="methodname">ReflectionClass::newLazyGhost()</a></span> ou
   <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>, ou após
   a instanciação usando
   <span class="methodname"><a href="reflectionclass.resetaslazyghost.php" class="methodname">ReflectionClass::resetAsLazyGhost()</a></span> ou
   <span class="methodname"><a href="reflectionclass.resetaslazyproxy.php" class="methodname">ReflectionClass::resetAsLazyProxy()</a></span>. Depois disso, um
   objeto lento pode ser inicializado por meio de uma das seguintes operações:
  </p>

  <ul class="simplelist">
   <li>
    Interagir com o objeto de uma forma que acione a inicialização automática. Consulte
    <a href="language.oop5.lazy-objects.php#language.oop5.lazy-objects.initialization-triggers" class="link">Gatilhos de
    inicialização</a>.
   </li>
   <li>
    Marcar todas as suas propriedades como não-lentas usando
    <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span> ou
    <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>.
   </li>
   <li>
    Chamar explicitamente <span class="methodname"><a href="reflectionclass.initializelazyobject.php" class="methodname">ReflectionClass::initializeLazyObject()</a></span>
    ou <span class="methodname"><a href="reflectionclass.marklazyobjectasinitialized.php" class="methodname">ReflectionClass::markLazyObjectAsInitialized()</a></span>.
   </li>
  </ul>

  <p class="simpara">
   Como os objetos lentos são inicializados quando todas as suas propriedades são marcadas
   como não-lentas, os métodos acima não marcarão um objeto como lento se nenhuma propriedade
   puder ser marcada como lenta.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.initialization-triggers">
  <h3 class="title">Gatilhos de Inicialização</h3>

  <p class="simpara">
   Objetos lentos são projetados para serem totalmente transparentes para seus consumidores,
   portanto, operações normais que observam ou modificam o estado do objeto
   acionará automaticamente a inicialização antes que a operação seja executada. Isto
   inclui, mas não está limitado às seguintes operações:
  </p>

  <ul class="simplelist">
   <li>
    Ler ou escrever uma propriedade.
   </li>
   <li>
    Testar se uma propriedade está definida ou desativada.
   </li>
   <li>
    Acessar ou modificar uma propriedade via
    <span class="methodname"><a href="reflectionproperty.getvalue.php" class="methodname">ReflectionProperty::getValue()</a></span>,
    <span class="methodname"><a href="reflectionproperty.getrawvalue.php" class="methodname">ReflectionProperty::getRawValue()</a></span>,
    <span class="methodname"><a href="reflectionproperty.setvalue.php" class="methodname">ReflectionProperty::setValue()</a></span>
    ou <span class="methodname"><a href="reflectionproperty.setrawvalue.php" class="methodname">ReflectionProperty::setRawValue()</a></span>.
   </li>
   <li>
    Listae propriedades com
    <span class="methodname"><strong>ReflectionObject::getProperties()</strong></span>,
    <span class="methodname"><strong>ReflectionObject::getProperty()</strong></span> ou
    <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span>.
   </li>
   <li>
    Iterar sobre propriedades de um objeto que não implementa
    <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span> ou
    <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span> usando
    <a href="control-structures.foreach.php" class="link">foreach</a>.
   </li>
   <li>
    Serializar o objeto com <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>,
    <span class="function"><a href="function.json-encode.php" class="function">json_encode()</a></span> etc.
   </li>
   <li>
    <a href="language.oop5.lazy-objects.php#language.oop5.lazy-objects.cloning" class="link">Clonar</a> o
    objeto.
   </li>
  </ul>

  <p class="simpara">
   Chamadas de método que não acessam o estado do objeto não acionarão
   a inicialização. Da mesma forma, as interações com o objeto que invocam métodos
   mágicos ou funções de gancho não acionarão a inicialização se esses métodos
   ou funções não acessarem o estado do objeto.
  </p>

  <div class="sect3">
   <h4 class="title">Operações sem Acionamento</h4>

   <p class="simpara">
    Os seguintes métodos específicos ou operações de baixo nível permitem acesso ou
    modificação de objetos lentos sem acionar a inicialização:
   </p>

   <ul class="simplelist">
    <li>
     Marcar propriedades como não-lentas com
     <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span> ou
     <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>.
    </li>
    <li>
     Recuperar a representação interna de propriedades usando
     <span class="function"><a href="function.get-mangled-object-vars.php" class="function">get_mangled_object_vars()</a></span> ou através da
     <a href="language.types.array.php#language.types.array.casting" class="link">conversão de um objeto para um
     array</a>.
    </li>
    <li>
     Usar <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> quando
     <strong><code><a href="class.reflectionclass.php#reflectionclass.constants.skip-initialization-on-serialize">ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE</a></code></strong>
     está definida, a menos que
     <a href="language.oop5.magic.php#object.serialize" class="link">__serialize()</a> ou
     <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> acionem a inicialização.
    </li>
    <li>
     Chamar <span class="methodname"><strong>ReflectionObject::__toString()</strong></span>.
    </li>
    <li>
     Usar <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> ou
     <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span>, a menos que
     <a href="language.oop5.magic.php#object.debuginfo" class="link">__debugInfo()</a> acione
     a inicialização.
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.initialization-sequence">
  <h3 class="title">Sequência de Inicialização</h3>

  <p class="simpara">
   Esta seção descreve a sequência de operações executadas quando
   a inicialização é acionada, com base na estratégia em uso.
  </p>

  <div class="sect3">
   <h4 class="title">Objetos Fantasmas</h4>
   <ul class="simplelist">
    <li>
     O objeto é marcado como não-lento.
    </li>
    <li>
     Propriedades não inicializadas com
     <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span> ou
     <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>
     são definidas com seus valores padrão, se houver. Neste estágio, o objeto
     se assemelha a um criado com
     <span class="methodname"><a href="reflectionclass.newinstancewithoutconstructor.php" class="methodname">ReflectionClass::newInstanceWithoutConstructor()</a></span>,
     exceto pelas propriedades já inicializadas.
    </li>
    <li>
     A função inicializadora é então chamada com o objeto como seu primeiro
     parâmetro. A função é esperada, mas não obrigatória, para inicializar
     o estado do objeto e deve retornar <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> ou nenhum valor. O objeto não é
     mais lento neste ponto, então a função pode acessar suas propriedades
     diretamente.
    </li>
   </ul>
   <p class="simpara">
    Após a inicialização, o objeto é indistinguível de um objeto que
    nunca foi lento.
   </p>
  </div>

  <div class="sect3">
   <h4 class="title">Objetos Proxy</h4>
   <ul class="simplelist">
    <li>
     O objeto é marcado como não-lento.
    </li>
    <li>
     Ao contrário dos objetos fantasmas, as propriedades do objeto não são modificadas
     neste estágio.
    </li>
    <li>
     A função de fábrica é chamada com o objeto como seu primeiro parâmetro e
     deve retornar uma instância não-lenta de uma classe compatível (veja
     <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>).
    </li>
    <li>
     A instância retornada é chamada de <em>instância
     real</em> e é anexada ao proxy.
    </li>
    <li>
     Os valores das propriedades do proxy são descartados como se
     <span class="function"><a href="function.unset.php" class="function">unset()</a></span> tivesse sido chamada.
    </li>
   </ul>
   <p class="simpara">
    Após a inicialização, acessar qualquer propriedade no proxy
    produzirá o mesmo resultado que acessar a propriedade correspondente na
    instância real; todos os acessos de propriedade no proxy são encaminhados
    para a instância real, incluindo propriedades declaradas, dinâmicas,
    inexistentes ou marcadas com
    <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span> ou
    <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>.
   </p>
   <p class="simpara">
    O objeto proxy em si <em>não</em> é substituído
    pela instância real.
   </p>
   <p class="simpara">
    Embora a fábrica receba o proxy como primeiro parâmetro, não se
    espera modificá-lo (modificações são permitidas, mas serão perdidas
    durante a etapa final de inicialização). Entretanto, o proxy pode ser usado
    para decisões baseadas nos valores das propriedades inicializadas, na classe,
    no próprio objeto ou em sua identidade. Por exemplo, o inicializador pode
    usar o valor de uma propriedade inicializada ao criar a instância real.
   </p>
  </div>

  <div class="sect3">
   <h4 class="title">Comportamento Comum</h4>

   <p class="simpara">
    O escopo e o contexto <var class="varname">$this</var> do inicializador ou da função de
    fábrica permanecem inalterados e as restrições de visibilidade usuais se aplicam.
   </p>

   <p class="simpara">
    Após a inicialização bem-sucedida, o inicializador ou função de fábrica
    não é mais referenciado pelo objeto e pode ser liberado se não tiver
    outras referências.
   </p>

   <p class="simpara">
    Se o inicializador lançar uma exceção, o estado do objeto será revertido para seu
    estado de pré-inicialização e o objeto será marcado como lento novamente. Em outras
    palavras, todos os efeitos no próprio objeto são revertidos. Outros efeitos colaterais,
    como efeitos em outros objetos, não são revertidos. Isso evita
    a exposição de uma instância parcialmente inicializada em caso de falha.
   </p>
  </div>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.cloning">
  <h3 class="title">Clonagem</h3>

  <p class="simpara">
   <a href="language.oop5.cloning.php" class="link">Clonar</a>
   um objeto lento aciona sua inicialização antes do clone ser
   criado, resultando em um objeto inicializado.
  </p>

  <p class="simpara">
   Para objetos proxy, tanto o proxy quanto sua instância real são clonados e
   o clone do proxy é retornado.
   O método <a href="language.oop5.cloning.php#object.clone" class="link"><code class="literal">__clone</code></a>
   é chamado na instância real, não no proxy.
   O proxy clonado e a instância real são vinculados como estão durante
   a inicialização, portanto, os acessos ao clone do proxy são encaminhados para o clone
   da instância real.
  </p>

  <p class="simpara">
   Esse comportamento garante que o clone e o objeto original mantenham
   estados separados. As alterações no objeto original ou no estado de seu inicializador
   após a clonagem não afetam o clone. Clonar o proxy e sua instância
   real, em vez de retornar apenas um clone da instância real, garante
   que a operação de clonagem retorne consistentemente um objeto da mesma classe.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.destructors">
  <h3 class="title">Destrutores</h3>

  <p class="simpara">
   Para fantasmas lentos, o destrutor só é chamado se o objeto tiver sido
   inicializado. Para proxies, o destrutor só é chamado na instância real,
   se existir.
  </p>

  <p class="simpara">
   Os métodos <span class="methodname"><a href="reflectionclass.resetaslazyghost.php" class="methodname">ReflectionClass::resetAsLazyGhost()</a></span> e
   <span class="methodname"><a href="reflectionclass.resetaslazyproxy.php" class="methodname">ReflectionClass::resetAsLazyProxy()</a></span> podem invocar
   o destrutor do objeto que está sendo redefinido.
  </p>
 </div>
</div><?php manual_footer($setup); ?>