<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.oop5.lazy-objects.php',
    1 => 'Objets paresseux',
    2 => 'Objets paresseux',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Les classes et les objets',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.variance.php',
    1 => 'Covariance et Contravariance',
  ),
  'next' => 
  array (
    0 => 'language.oop5.changelog.php',
    1 => 'Modifications en POO (Programmation orient&eacute;e objet)',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Objets paresseux</h2>

 <p class="simpara">
  Un objet paresseux est un objet dont l&#039;initialisation est différée jusqu&#039;à
  ce que son état soit observé ou modifié. Quelques exemples d&#039;utilisation incluent des composants
  d&#039;injection de dépendances qui fournissent des services paresseux entièrement initialisés
  uniquement si nécessaire, des <abbr>ORM</abbr>s fournissant des entités paresseuses qui s&#039;hydratent
  depuis la base de données uniquement lorsqu&#039;elles sont accédées, ou un
  analyseur JSON qui retarde l&#039;analyse jusqu&#039;à ce que les éléments soient accédés.
 </p>

 <p class="simpara">
  Deux stratégies d&#039;objets paresseux sont prises en charge : les objets fantômes (Ghost) et les
  proxys virtuels (Virtual Proxies), ci-après appelés &quot;fantômes paresseux&quot; et
  &quot;proxys paresseux&quot;.
  Dans les deux stratégies, l&#039;objet paresseux est attaché à un initialiseur ou une fabrique
  qui est appelé automatiquement lorsque son état est observé ou modifié pour
  la première fois. D&#039;un point de vue d&#039;abstraction, les objets paresseux sont
  indiscernables des non-paresseux : ils peuvent être utilisés sans savoir qu&#039;ils
  sont paresseux, ce qui permet de les passer et de les utiliser par du code qui n&#039;est pas conscient
  de la paresse. Les proxys paresseux sont également transparents, mais il faut faire attention lorsque
  leur identité est utilisée, car le proxy et son instance réelle ont des identités
  différentes.
 </p>

 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <strong>Information de version</strong><br />
  <span class="simpara">
   Les objets paresseux ont été introduits en PHP 8.4.
  </span>
 </p></blockquote>

 <div class="sect2" id="language.oop5.lazy-objects.creation">
  <h3 class="title">Création d&#039;objets paresseux</h3>

  <p class="simpara">
   Il est possible de créer une instance paresseuse de n&#039;importe quelle classe définie par l&#039;utilisateur ou de la
   classe <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span> (d&#039;autres classes internes ne sont pas
   prises en charge), ou de réinitialiser une instance de ces classes pour la rendre paresseuse.
   Les points d&#039;entrée pour créer un objet paresseux sont les méthodes
   <span class="methodname"><a href="reflectionclass.newlazyghost.php" class="methodname">ReflectionClass::newLazyGhost()</a></span> et
   <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>.
  </p>

  <p class="simpara">
   Les deux méthodes acceptent une fonction qui est appelée lorsque l&#039;objet nécessite
   une initialisation. Le comportement attendu de la fonction varie en fonction de la
   stratégie utilisée, comme décrit dans la documentation de référence de chaque méthode.
  </p>

  <div class="example" id="example-1">
   <p><strong>Exemple #1 Création d&#039;un fantôme paresseux</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">// Initialise l'objet sur place<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">// Déclenche l'initialisation<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>L&#039;exemple ci-dessus va afficher :</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>Exemple #2 Création d&#039;un proxy paresseux</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">// Crée et retourne l'instance réelle<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">// Déclenche l'initialisation<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>L&#039;exemple ci-dessus va afficher :</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">
   N&#039;importe quel accès à des propriétés d&#039;un objet paresseux déclenche son initialisation
   (y compris via <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span>).
   Cependant, certaines propriétés peuvent être connues à l&#039;avance et ne devraient pas déclencher
   l&#039;initialisation lorsqu&#039;elles sont accédées :
  </p>

  <div class="example" id="example-3">
   <p><strong>Exemple #3 Initialisation des propriétés de manière impatiente</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">// Sans cette ligne, l'appel suivant à ReflectionProperty::setValue() déclencherait<br />// l'initialisation.<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">// Également, on peut utiliser ceci directement :<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">// L'identifiant peut être accédé sans déclencher l'initialisation<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">
   Les méthodes <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span> et
   <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>
   offrent des moyens de contourner l&#039;initialisation paresseuse lors de l&#039;accès à une propriété.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.patterns">
  <h3 class="title">À propos des stratégies d&#039;objets paresseux</h3>

  <p class="simpara">
   Les <em>fantômes paresseux</em> sont des objets qui s&#039;initialisent sur place et,
   une fois initialisés, sont indiscernables d&#039;un objet qui n&#039;était jamais paresseux.
   Cette stratégie est adaptée lorsque nous contrôlons à la fois l&#039;instanciation et
   l&#039;initialisation de l&#039;objet et est inadaptée si l&#039;une de ces opérations est
   gérée par une autre partie.
  </p>

  <p class="simpara">
   Les <em>proxys paresseux</em>, une fois initialisés, agissent comme des proxys
   vers une instance réelle : toute opération sur un proxy paresseux initialisé est
   transmise à l&#039;instance réelle. La création de l&#039;instance réelle peut être déléguée
   à une autre partie, ce qui rend cette stratégie utile dans les cas où les fantômes
   paresseux sont inadaptés. Bien que les proxys paresseux soient presque aussi transparents
   que les fantômes paresseux, il faut faire attention lorsque leur identité est utilisée,
   car le proxy et son instance réelle ont des identités distinctes.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.lifecycle">
  <h3 class="title">Cycle de vie des objets paresseux</h3>

  <p class="simpara">
   Les objets peuvent être rendus paresseux lors de l&#039;instanciation en utilisant
   <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 après
   l&#039;instanciation en utilisant
   <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>. Ensuite, un
   objet paresseux peut être initialisé par l&#039;une des opérations suivantes :
  </p>

  <ul class="simplelist">
   <li>
    Interagir avec l'objet d'une manière qui déclenche l'initialisation automatique. Voir
    <a href="language.oop5.lazy-objects.php#language.oop5.lazy-objects.initialization-triggers" class="link">déclencheurs
    d&#039;initialisation</a>.
   </li>
   <li>
    Marquer toutes ses propriétés comme non-paresseuses en utilisant
    <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>
    Appeler explicitement <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">
   Comme les objets paresseux sont initialisés lorsque toutes leurs propriétés sont marquées
   non-paresseuses, les méthodes ci-dessus ne marqueront pas un objet comme paresseux si aucune propriété
   ne peut être marquée comme paresseuse.
  </p>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.initialization-triggers">
  <h3 class="title">Déclencheurs d&#039;initialisation</h3>

  <p class="simpara">
   Les objets paresseux sont conçus pour être entièrement transparents pour leurs consommateurs,
   de sorte que les opérations normales qui observent ou modifient l&#039;état de l&#039;objet déclencheront
   automatiquement l&#039;initialisation avant que l&#039;opération ne soit effectuée. Cela
   inclut, mais sans s&#039;y limiter, les opérations suivantes :
  </p>

  <ul class="simplelist">
   <li>
    Lire ou écrire une propriété
   </li>
   <li>
    Tester si une propriété est définie ou la supprimer.
   </li>
   <li>
    Accéder ou modifier une propriété 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>
    Lister les propriétés avec
    <span class="methodname"><strong>ReflectionObject::getProperties()</strong></span>,
    <span class="methodname"><strong>ReflectionObject::getProperty()</strong></span>,
    <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span>.
   </li>
   <li>
    Itérer les propriétés d'un objet qui n'implémente pas
    <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> en utilisant
    <a href="control-structures.foreach.php" class="link">foreach</a>.
   </li>
   <li>
    Sérialiser l'objet avec <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">Cloner</a> l'objet.
   </li>
  </ul>

  <p class="simpara">
   Les appels de méthodes qui n&#039;accèdent pas à l&#039;état de l&#039;objet ne déclencheront pas
   l&#039;initialisation. De même, les interactions avec l&#039;objet qui invoquent des méthodes magiques
   ou des fonctions de crochet ne déclencheront pas l&#039;initialisation si ces méthodes
   ou fonctions n&#039;accèdent pas à l&#039;état de l&#039;objet.
  </p>

  <div class="sect3">
   <h4 class="title">Opérations non déclenchantes</h4>

   <p class="simpara">
    Les méthodes ou opérations spécifiques suivantes permettent d&#039;accéder ou de modifier
    des objets paresseux sans déclencher l&#039;initialisation :
   </p>

   <ul class="simplelist">
    <li>
     Marquer les propriétés comme non-paresseuses avec
     <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>
     Récupérer la représentation interne des propriétés en utilisant
     <span class="function"><a href="function.get-mangled-object-vars.php" class="function">get_mangled_object_vars()</a></span> ou en
     <a href="language.types.array.php#language.types.array.casting" class="link">convertissant l&#039;objet en
     un tableau</a>.
    </li>
    <li>
     Utiliser <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> lorsque
     <strong><code><a href="class.reflectionclass.php#reflectionclass.constants.skip-initialization-on-serialize">ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE</a></code></strong>
     est défini, sauf si
     <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> déclenche l'initialisation.
    </li>
    <li>
     Appeler <span class="methodname"><strong>ReflectionObject::__toString()</strong></span>.
    </li>
    <li>
     Utiliser <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>, sauf si
     <a href="language.oop5.magic.php#object.debuginfo" class="link">__debugInfo()</a> déclenche
     l'initialisation
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="language.oop5.lazy-objects.initialization-sequence">
  <h3 class="title">Séquence d&#039;initialisation</h3>

  <p class="simpara">
   Cette section décrit la séquence d&#039;opérations effectuées lorsqu&#039;une
   initialisation est déclenchée, en fonction de la stratégie utilisée.
  </p>

  <div class="sect3">
   <h4 class="title">Objets fantômes</h4>
   <ul class="simplelist">
    <li>
     L'objet est marqué comme non-paresseux.
    </li>
    <li>
     Les propriétés non initialisées avec
     <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>
     sont définies sur leurs valeurs par défaut, le cas échéant. À ce stade, l'objet
     ressemble à un objet créé avec
     <span class="methodname"><a href="reflectionclass.newinstancewithoutconstructor.php" class="methodname">ReflectionClass::newInstanceWithoutConstructor()</a></span>,
     sauf pour les propriétés déjà initialisées.
    </li>
    <li>
     La fonction d'initialisation est ensuite appelée avec l'objet comme premier
     paramètre. La fonction est censée, mais pas obligée, d'initialiser
     l'état de l'objet, et doit retourner <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> ou aucune valeur. L'objet n'est plus
     paresseux à ce stade, donc la fonction peut accéder directement à ses propriétés.
    </li>
   </ul>
   <p class="simpara">
    Après l&#039;initialisation, l&#039;objet est indiscernable d&#039;un objet qui n&#039;a
    jamais été paresseux.
   </p>
  </div>

  <div class="sect3">
   <h4 class="title">Objets proxys</h4>
   <ul class="simplelist">
    <li>
     L'objet est marqué comme non-paresseux.
    </li>
    <li>
     Contrairement aux objets fantômes, les propriétés de l'objet ne sont pas modifiées à
     cette étape.
    </li>
    <li>
     La fonction fabrique est appelée avec l'objet comme premier paramètre et doit
     retourner une instance non-paresseuse d'une classe compatible (voir
     <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>).
    </li>
    <li>
     L'instance retournée est appelée <em>instance
     réelle</em> et est attachée au proxy.
    </li>
    <li>
     Les valeurs des propriétés du proxy sont jetées comme si
     <span class="function"><a href="function.unset.php" class="function">unset()</a></span> était appelé.
    </li>
   </ul>
   <p class="simpara">
    Après l&#039;initialisation, l&#039;accès à n&#039;importe quelle propriété sur le proxy
    donnera le même résultat que l&#039;accès à la propriété correspondante sur
    l&#039;instance réelle ; tous les accès aux propriétés sur le proxy sont transmis à
    l&#039;instance réelle, y compris les propriétés déclarées, dynamiques, inexistantes,
    ou les propriétés marquées avec
    <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">
    L&#039;objet proxy lui-même n&#039;est <em>pas</em> remplacé ou substitué
    par l&#039;instance réelle.
   </p>
   <p class="simpara">
    Tandis que la fabrique reçoit le proxy comme premier paramètre, il n&#039;est
    pas attendu qu&#039;elle le modifie (les modifications sont autorisées mais seront perdues
    lors de l&#039;étape finale d&#039;initialisation). Cependant, le proxy peut être utilisé
    pour des décisions basées sur les valeurs des propriétés initialisées, la classe,
    l&#039;objet lui-même, ou son identité. Par exemple, l&#039;initialiseur pourrait
    utiliser la valeur d&#039;une propriété initialisée lors de la création de l&#039;instance réelle.
   </p>
  </div>

  <div class="sect3">
   <h4 class="title">Comportement commun</h4>

   <p class="simpara">
    La portée et le contexte <var class="varname">$this</var> de la fonction d&#039;initialisation ou de la fabrique
    restent inchangés, et les contraintes de visibilité habituelles s&#039;appliquent.
   </p>

   <p class="simpara">
    Après une initialisation réussie, la fonction d&#039;initialisation ou la fabrique
    n&#039;est plus référencée par l&#039;objet et peut être libérée si elle n&#039;a pas d&#039;autres
    références.
   </p>

   <p class="simpara">
    Si l&#039;initialisation lève une exception, l&#039;état de l&#039;objet est rétabli à son
    état pré-initialisation et l&#039;objet est à nouveau marqué comme paresseux. En d&#039;autres
    termes, tous les effets sur l&#039;objet lui-même sont annulés. Les autres effets
    secondaires, tels que les effets sur d&#039;autres objets, ne sont pas annulés. Cela
    empêche l&#039;exposition d&#039;une instance partiellement initialisée en cas d&#039;échec.
   </p>
  </div>
 </div>

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

  <p class="simpara">
   <a href="language.oop5.cloning.php" class="link">Cloner</a>
   un objet paresseux déclenche son initialisation avant que le clone ne soit
   créé, résultant en un objet initialisé.
  </p>

  <p class="simpara">
   Pour les objets proxys, le proxy et son instance réelle sont clonés, et
   le clone du proxy est retourné.
   La méthode <a href="language.oop5.cloning.php#object.clone" class="link"><code class="literal">__clone</code></a> est
   appelée sur l&#039;instance réelle, pas sur le proxy.
   Le proxy cloné et l&#039;instance réelle clonée sont liés comme ils le sont pendant
   l&#039;initialisation, donc les accès au clone du proxy sont transmis au clone de
   l&#039;instance réelle.
  </p>

  <p class="simpara">
   Ce comportement garantit que le clone et l&#039;objet original maintiennent
   des états séparés. Les modifications apportées à l&#039;objet original ou à l&#039;état de son initialisateur
   après le clonage n&#039;affectent pas le clone. Cloner à la fois le proxy et son instance réelle,
   plutôt que de retourner un clone de l&#039;instance réelle seule, garantit que l&#039;opération de clonage
   retourne systématiquement un objet de la même classe.
  </p>
 </div>

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

  <p class="simpara">
   Pour les objets paresseux, le destructeur n&#039;est appelé que si l&#039;objet a été
   initialisé. Pour les proxys, le destructeur n&#039;est appelé que sur l&#039;instance réelle,
   si elle existe.
  </p>

  <p class="simpara">
   Les méthodes <span class="methodname"><a href="reflectionclass.resetaslazyghost.php" class="methodname">ReflectionClass::resetAsLazyGhost()</a></span> et
   <span class="methodname"><a href="reflectionclass.resetaslazyproxy.php" class="methodname">ReflectionClass::resetAsLazyProxy()</a></span> peuvent invoquer
   le destructeur de l&#039;objet réinitialisé.
  </p>
 </div>
</div><?php manual_footer($setup); ?>