<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mongodb.architecture.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'mongodb.persistence.php',
    1 => 'Persister des donn&eacute;es',
    2 => 'S&eacute;rialisation et d&eacute;s&eacute;rialisation des variables PHP dans MongoDB',
  ),
  'up' => 
  array (
    0 => 'mongodb.architecture.php',
    1 => 'Architecture et fonctionnalit&eacute;s sp&eacute;ciales',
  ),
  'prev' => 
  array (
    0 => 'mongodb.connection-handling.php',
    1 => 'Connections',
  ),
  'next' => 
  array (
    0 => 'mongodb.security.php',
    1 => 'S&eacute;curit&eacute;',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/mongodb/architecture.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mongodb.persistence" class="section">
  
  <h2 class="title">Sérialisation et désérialisation des variables PHP dans MongoDB</h2>

  <p class="para">
   Ce document explique comment les structures composées (c&#039;est-à-dire les
   documents, les tableaux et les objets) sont converties entre les valeurs BSON et PHP.
  </p>

  <div class="section" id="mongodb.persistence.serialization">
   <h2 class="title">Sérialisation en BSON</h2>

   <div class="section">
    <h2 class="title">Tableaux</h2>

    <p class="para">
     Si un tableau est un <em>tableau compact</em> — c&#039;est-à-dire un
     tableau vide ou les clés commencent à 0 et sont séquentielles sans trous :
     <em>tableau BSON</em>.
    </p>

    <p class="para">
     Si le tableau n&#039;est pas compact — c&#039;est-à-dire qu&#039;il a des clés
     associatives (chaînes), que les clés ne commencent pas à 0, ou qu&#039;il y a
     des trous : <em>objet BSON</em>.
    </p>

    <p class="para">
     Un document de niveau supérieur (racine), <em>toujours</em>
     sérialisé en tant que document BSON.
    </p>

    <div class="section">
     <h2 class="title">Exemples</h2>

     <p class="para">
      Ces exemples sérialisent en tant que tableau BSON :
     </p>

     <div class="example-contents">
<div class="textcode"><pre class="textcode">[ 8, 5, 2, 3 ] =&gt; [ 8, 5, 2, 3 ]
[ 0 =&gt; 4, 1 =&gt; 9 ] =&gt; [ 4, 9 ]</pre>
</div>
     </div>


     <p class="para">
      Ces exemples sérialisent en tant qu&#039;objet BSON :
     </p>

     <div class="example-contents">
<div class="textcode"><pre class="textcode">[ 0 =&gt; 1, 2 =&gt; 8, 3 =&gt; 12 ] =&gt; { &quot;0&quot; : 1, &quot;2&quot; : 8, &quot;3&quot; : 12 }
[ &quot;foo&quot; =&gt; 42 ] =&gt; { &quot;foo&quot; : 42 }
[ 1 =&gt; 9, 0 =&gt; 10 ] =&gt; { &quot;1&quot; : 9, &quot;0&quot; : 10 }</pre>
</div>
     </div>


     <p class="para">
      Il est à noter que les cinq exemples sont des <em>extraits</em>
      d&#039;un document complet, et ne représentent qu&#039;une <em>valeur</em>
      à l&#039;intérieur d&#039;un document.
     </p>

    </div>
   </div>

   <div class="section">
    <h2 class="title">Objets</h2>

     <p class="para">
      Si un objet est de la classe <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>, sérialiser
      en tant que <em>document BSON</em>.
     </p>

     <p class="para">
      Si un objet est une classe supportée qui implémente
      <span class="interfacename"><a href="class.mongodb-bson-type.php" class="interfacename">MongoDB\BSON\Type</a></span>, alors utiliser la logique
      de sérialisation BSON pour ce type spécifique.
      Les instances de <span class="interfacename"><a href="class.mongodb-bson-type.php" class="interfacename">MongoDB\BSON\Type</a></span> (à
      l&#039;exclusion de <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span>)
      ne peuvent être sérialisées que comme valeur de champ de document. Tenter
      de sérialiser un tel objet en tant que document racine lèvera une
      <span class="classname"><a href="class.mongodb-driver-exception-unexpectedvalueexception.php" class="classname">MongoDB\Driver\Exception\UnexpectedValueException</a></span>.
     </p>

     <p class="para">
      Si un objet est d&#039;une classe inconnue implémentant l&#039;interface
      <span class="interfacename"><a href="class.mongodb-bson-type.php" class="interfacename">MongoDB\BSON\Type</a></span>, alors une
      <span class="classname"><a href="class.mongodb-driver-exception-unexpectedvalueexception.php" class="classname">MongoDB\Driver\Exception\UnexpectedValueException</a></span> est lancée.
     </p>

     <p class="para">
      Si un objet est d&#039;une classe autre, sans implémenter une interface spéciale,
      sérialiser en tant que <em>document BSON</em>. Garder seulement
      les propriétés <em>public</em>, et ignorer les propriétés
      <em>protected</em> et <em>private</em>.
     </p>

     <p class="para">
      Si un objet est d&#039;une classe qui implémente
      <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span>, appeler
      <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span> et
      utiliser le tableau ou <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span> retourné pour
      sérialiser en tant que document BSON ou tableau. Le type BSON sera
      déterminé par les règles suivantes :
     </p>

     <p class="para">
      <ol type="1">
       <li class="listitem">
        <p class="para">Les documents racines doivent être sérialisés en tant que
         document BSON.
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         Les objets <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span> doivent
         être sérialisés en tant que document BSON.
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         Si <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>
         retourne un tableau compact, sérialiser en tant que tableau BSON.
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         Si <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>
         retourne un tableau non-compact ou <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>,
         sérialiser en tant qu&#039;objet BSON.
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         Si <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>
         ne retourne pas un tableau ou <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>, lance
         une exception
         <span class="classname"><a href="class.mongodb-driver-exception-unexpectedvalueexception.php" class="classname">MongoDB\Driver\Exception\UnexpectedValueException</a></span>.
        </p>
       </li>
      </ol>
     </p>

     <p class="para">
      Si un objet est d&#039;une classe qui implémente l&#039;interface
      <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span> (qui implique
      <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span>), obtenir les
      propriétés de manière similaire aux paragraphes précédents, mais
      <em>aussi</em> ajouter une propriété
      <span class="property">__pclass</span> en tant que valeur binaire, avec un sous-type
      <code class="literal">0x80</code> et des données portant le nom de la classe
      entièrement qualifié de l&#039;objet qui est sérialisé.
     </p>

     <p class="para">
      La propriété <span class="property">__pclass</span> est ajoutée au tableau ou à
      l&#039;objet retourné par
      <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>, ce qui
      signifie qu&#039;elle écrasera toute clé/propriété <span class="property">__pclass</span>
      dans la valeur de retour de
      <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>. Si l&#039;on
      veut éviter ce comportement et définir sa propre valeur
      <span class="property">__pclass</span>,
      il ne faut <em>pas</em> implémenter
      <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span> et devriez plutôt
      implémenter
      <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span> directement.
     </p>

     <div class="section">
      <h2 class="title">Exemples</h2>

      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">stdClass<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />} </span><span style="color: #FF8000">// =&gt; {"foo": 42}<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$prot </span><span style="color: #007700">= </span><span style="color: #DD0000">'wine'</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$fpr </span><span style="color: #007700">= </span><span style="color: #DD0000">'cheese'</span><span style="color: #007700">;<br />} </span><span style="color: #FF8000">// =&gt; {"foo": 42}<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AnotherClass1 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$prot </span><span style="color: #007700">= </span><span style="color: #DD0000">'wine'</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$fpr </span><span style="color: #007700">= </span><span style="color: #DD0000">'cheese'</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return [</span><span style="color: #DD0000">'foo' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">, </span><span style="color: #DD0000">'prot' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prot</span><span style="color: #007700">];<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"foo": 42, "prot": "wine"}<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AnotherClass2 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): </span><span style="color: #0000BB">self<br />    </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">;<br />    }<br />} </span><span style="color: #FF8000">// =&gt; MongoDB\Driver\Exception\UnexpectedValueException("bsonSerialize() did not return an array or stdClass")<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AnotherClass3 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$elements </span><span style="color: #007700">= [</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">, </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">];<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">elements</span><span style="color: #007700">;<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"0": "foo", "1": "bar"}<br /><br />/**<br /> * Nesting Serializable classes<br /> */<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AnotherClass4 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$elements </span><span style="color: #007700">= [</span><span style="color: #0000BB">0 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">];<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">elements</span><span style="color: #007700">;<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"0": "foo", "2": "bar"}<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ContainerClass1 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$things</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">things </span><span style="color: #007700">= new </span><span style="color: #0000BB">AnotherClass4</span><span style="color: #007700">();<br />    }<br /><br />    function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return [</span><span style="color: #DD0000">'things' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">things</span><span style="color: #007700">];<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"things": {"0": "foo", "2": "bar"}}<br /><br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AnotherClass5 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$elements </span><span style="color: #007700">= [</span><span style="color: #0000BB">0 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">];<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return </span><span style="color: #0000BB">array_values</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">elements</span><span style="color: #007700">);<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"0": "foo", "1": "bar"} en tant que classe racine<br />  //        ["foo", "bar"] en tant que valeur imbriquée<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ContainerClass2 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$things</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">things </span><span style="color: #007700">= new </span><span style="color: #0000BB">AnotherClass5</span><span style="color: #007700">();<br />    }<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return [</span><span style="color: #DD0000">'things' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">things</span><span style="color: #007700">];<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"things": ["foo", "bar"]}<br /><br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AnotherClass6 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$elements </span><span style="color: #007700">= [</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">, </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">];<br /><br />    function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): </span><span style="color: #0000BB">object<br />    </span><span style="color: #007700">{<br />        return (object) </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">elements</span><span style="color: #007700">;<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"0": "foo", "1": "bar"}<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ContainerClass3 </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Serializable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$things</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">things </span><span style="color: #007700">= new </span><span style="color: #0000BB">AnotherClass6</span><span style="color: #007700">();<br />    }<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return [</span><span style="color: #DD0000">'things' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">things</span><span style="color: #007700">];<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"things": {"0": "foo", "1": "bar"}}<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">UpperClass </span><span style="color: #007700">implements </span><span style="color: #0000BB">MongoDB\BSON\Persistable<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$prot </span><span style="color: #007700">= </span><span style="color: #DD0000">'wine'</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$fpr </span><span style="color: #007700">= </span><span style="color: #DD0000">'cheese'</span><span style="color: #007700">;<br /><br />    private </span><span style="color: #0000BB">$data</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">bsonUnserialize</span><span style="color: #007700">(array </span><span style="color: #0000BB">$data</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data </span><span style="color: #007700">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">bsonSerialize</span><span style="color: #007700">(): array<br />    {<br />        return [</span><span style="color: #DD0000">'foo' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">, </span><span style="color: #DD0000">'prot' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prot</span><span style="color: #007700">];<br />    }<br />} </span><span style="color: #FF8000">// =&gt; {"foo": 42, "prot": "wine", "__pclass": {"$type": "80", "$binary": "VXBwZXJDbGFzcw=="}}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </div>
  </div>

  <div class="section" id="mongodb.persistence.deserialization">
   <h2 class="title">Deserialization from BSON</h2>

   
   <div class="warning"><strong class="warning">Avertissement</strong>
    <p class="simpara">
     Les documents BSON peuvent techniquement contenir des clés dupliquées car
     les documents sont stockés en tant qu&#039;une liste de paire clé-valeur ;
     cependant, les applications devrait s&#039;abstenir de générer des
     documents avec des clés dupliquées car le comportement du serveur et du
     pilote peut être indéfinie. Puisque les objets et tableaux PHP ne peuvent
     pas avoir de clés dupliquées, les données pourraient aussi être perdu lors
     du décodage d&#039;un document BSON avec des clés dupliquées.
    </p>
   </div>


   <p class="para">
    L&#039;ancienne extension <code class="code">mongo</code> désérialisait les documents BSON
    et les tableaux BSON en tant que tableaux PHP. Tant que les tableaux PHP sont
    pratiques à utiliser, ce comportement était problématique car différents
    types BSON pouvaient être désérialisés en la même valeur PHP (par exemple
    <code class="literal">{&quot;0&quot;: &quot;foo&quot;}</code> et <code class="literal">[&quot;foo&quot;]</code>) et rendait
    impossible d&#039;inférer le type BSON original. Par défaut, l&#039;extension
    <code class="code">mongodb</code> adresse cette préoccupation en s&#039;assurant que les
    tableaux BSON et les documents BSON sont convertis en tableaux et objets PHP,
    respectivement.
   </p>
   <p class="para">
    Pour les types composés, il existe trois types de données :
   </p>

   <p class="para">
    <dl>
     
      <dt>root</dt>
      <dd>
       <p class="para">
        réfère à un document BSON de niveau supérieur <em>seulement</em>
       </p>
      </dd>
     
     
      <dt>document</dt>
      <dd>
       <p class="para">
        réfère à des documents BSON imbriqués <em>seulement</em>
       </p>
      </dd>
     
     
      <dt>array</dt>
      <dd>
       <p class="para">
        réfère à un tableau BSON
       </p>
      </dd>
     
    </dl>
   </p>

   <p class="para">
    A part les trois types collectifs, il est aussi possible de configurer des
    champs spécifiques dans le document pour mapper les types de données
    mentionnés ci-dessous. Par exemple, le type de carte suivant permet de
    mapper chaque document intégré dans un tableau <code class="literal">&quot;addresses&quot;</code>
    à une classe <span class="classname"><strong class="classname">Address</strong></span> <em>et</em> chaque
    champ <code class="literal">&quot;city&quot;</code> dans ces documents d&#039;adresse intégrés à une
    classe <span class="classname"><strong class="classname">City</strong></span>:

    <div class="example-contents">
<div class="textcode"><pre class="textcode">[
    &#039;fieldPaths&#039; =&gt; [
        &#039;addresses.$&#039; =&gt; &#039;MyProject\Address&#039;,
        &#039;addresses.$.city&#039; =&gt; &#039;MyProject\City&#039;,
    ],
]</pre>
</div>
    </div>

   </p>

   <p class="para">
    Chacun de ces trois types de données, ainsi que les mappages spécifiques
    aux champs, peuvent être mappés contre différents types PHP. Les valeurs de
    mappage possibles sont:
   </p>

   <p class="para">
    <dl>
     
      <dt><em>non défini</em> ou <span class="type"><a href="language.types.null.php" class="type NULL">NULL</a></span> (par défaut)</dt>
      <dd>
       <p class="para">
        <ul class="itemizedlist">
         <li class="listitem">
          <p class="para">
           Un tableau BSON sera désérialisé en un <span class="type"><a href="language.types.array.php" class="type array">array</a></span> PHP.
          </p>
         </li>
         <li class="listitem">
          <p class="para">
           Un document BSON (racine ou imbriqué) sans propriété
            <span class="property">__pclass</span>
            <a href="#fnidmongodb.pclass" name="fnmongodb.pclass"><sup>[1]</sup></a>
            
           
           devient un objet <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>, avec chaque clé de document
           BSON définie comme une propriété de <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>
           publique.
          </p>
         </li>
         <li class="listitem">
          <p class="para">
           Un document BSON (racine ou imbriqué) avec une propriété
           <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a> devient un objet PHP de la classe
           nommée par la propriété <span class="property">__pclass</span>.
          </p>
          <p class="para">
           Si la classe nommée implémente l&#039;interface
           <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span>, alors les
           propriétés du document BSON, y compris la propriété
           <span class="property">__pclass</span>, sont envoyées sous forme de tableau
           associatif à la fonction
           <span class="methodname"><a href="mongodb-bson-unserializable.bsonunserialize.php" class="methodname">MongoDB\BSON\Unserializable::bsonUnserialize()</a></span>
           pour initialiser les propriétés de l&#039;objet.
          </p>
          <p class="para">
           Si la classe nommée n&#039;existe pas ou n&#039;implémente pas
           l&#039;interface <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span>,
           <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span> sera
           utilisé et chaque clé de document BSON (y compris <span class="property">__pclass</span>)
           sera définie comme une propriété publique de <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>.
          </p>
          <p class="para">
           La fonctionnalité <span class="property">__pclass</span> repose sur le fait
           que la propriété soit partie d&#039;un document MongoDB récupéré. Si l&#039;on
           utilise une
           <a href="mongodb-driver-query.construct.php#mongodb-driver-query.construct-queryOptions" class="link">projection</a>
           lors de la recherche de documents, il faut inclure le champ
           <span class="property">__pclass</span> dans la projection pour que cette
           fonctionnalité fonctionne.
          </p>
         </li>
        </ul>
       </p>
      </dd>
     

     
      <dt><code class="literal">&quot;array&quot;</code></dt>
      <dd>
       <p class="para">
        Transforme un tableau BSON en un <span class="type"><a href="language.types.array.php" class="type array">array</a></span> PHP. Il n&#039;y aura
        pas de traitement spécial d&#039;une propriété <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a>
        mais elle peut être définie comme un élément dans le tableau retourné
        si elle était présente dans le document BSON.
       </p>
      </dd>
     

     
      <dt><code class="literal">&quot;object&quot;</code> ou <code class="literal">&quot;stdClass&quot;</code></dt>
      <dd>
       <p class="para">
        Transforme un tableau BSON ou un document BSON en un objet
        <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>. Il n&#039;y aura pas de traitement spécial d&#039;une
        propriété <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a>
        mais elle peut être définie comme une propriété publique dans l&#039;objet
        retourné si elle était présente dans le document BSON.
       </p>
      </dd>
     

     
      <dt><code class="literal">&quot;bson&quot;</code></dt>
      <dd>
       <p class="para">
        Transforme un tableau BSON en un <span class="classname"><a href="class.mongodb-bson-packedarray.php" class="classname">MongoDB\BSON\PackedArray</a></span>
        et un document BSON en un <span class="classname"><a href="class.mongodb-bson-document.php" class="classname">MongoDB\BSON\Document</a></span>,
        indépendamment du fait que le document BSON ait une propriété
        <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a>.
       </p>
       <blockquote class="note"><p><strong class="note">Note</strong>: 
        <span class="simpara">
         La valeur <code class="literal">bson</code> n&#039;est disponible que pour les trois
         types racines, et non dans les mappages spécifiques aux champs.
        </span>
       </p></blockquote>
      </dd>
     

     
      <dt>toutes les autres chaînes de caractères</dt>
      <dd>
       <p class="para">
        Définit le nom de la classe à laquelle le document BSON doit être
        désérialisé. Pour les documents BSON qui incluent des propriétés
        <span class="property">__pclass</span>,
        cette classe prendra la priorité.
       </p>

       <p class="para">
        Si la classe nommée n&#039;existe pas ou n&#039;implémente pas
        l&#039;interface <span class="interfacename"><a href="class.mongodb-bson-unserializable.php" class="interfacename">MongoDB\BSON\Unserializable</a></span>,
        une exception
        <span class="classname"><a href="class.mongodb-driver-exception-invalidargumentexception.php" class="classname">MongoDB\Driver\Exception\InvalidArgumentException</a></span>
        est lancée.
       </p>

       <p class="para">
        Si l&#039;objet BSON a une propriété <span class="property">__pclass</span> et que
        cette classe existe et implémente
        <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span>, elle prendra
        le pas sur la classe fournie dans la carte de type.
       </p>

       <p class="para">
        Les propriétés du document BSON, <em>y compris</em> la propriété
        <span class="property">__pclass</span>,
        seront envoyées sous forme de tableau associatif à la fonction
        <span class="methodname"><a href="mongodb-bson-unserializable.bsonunserialize.php" class="methodname">MongoDB\BSON\Unserializable::bsonUnserialize()</a></span>
        pour initialiser les propriétés de l&#039;objet.
       </p>
      </dd>
     
    </dl>
   </p>

   <div class="section" id="mongodb.persistence.typemaps">
    <h2 class="title">TypeMaps</h2>

     <p class="para">
      Les TypeMaps peuvent être définis via la méthode
      <span class="methodname"><a href="mongodb-driver-cursor.settypemap.php" class="methodname">MongoDB\Driver\Cursor::setTypeMap()</a></span> sur un objet
      <span class="classname"><a href="class.mongodb-driver-cursor.php" class="classname">MongoDB\Driver\Cursor</a></span>, ou l&#039;argument
      <code class="literal">$typeMap</code> de
      <span class="function"><a href="function.mongodb.bson-tophp.php" class="function">MongoDB\BSON\toPHP()</a></span>,
      <span class="methodname"><a href="mongodb-bson-document.tophp.php" class="methodname">MongoDB\BSON\Document::toPHP()</a></span>, et
      <span class="methodname"><a href="mongodb-bson-packedarray.tophp.php" class="methodname">MongoDB\BSON\PackedArray::toPHP()</a></span>. Chacune des trois
      classes (<em>racine</em>, <em>document</em>, et
      <em>array</em>) peut être définie individuellement, en plus des
      types spécifiques aux champs.
     </p>

     <p class="para">
      Si la valeur dans le TypeMap est <span class="type"><a href="language.types.null.php" class="type NULL">NULL</a></span>, cela signifie la même
      chose que la valeur <em>par défaut</em> pour cet élément.
     </p>
    </div>

    <div class="section">
     <h2 class="title">Exemples</h2>

     <p class="para">
      Ces exemples utilisent les classes suivantes:
     </p>

     <p class="para">
      <dl>
       
        <dt>MyClass</dt>
        <dd>
         <p class="para">
          qui n&#039;implémente <em>aucune</em> interface
         </p>
        </dd>
       
       
        <dt>YourClass</dt>
        <dd>
         <p class="para">
          qui implémente
          <span class="interfacename"><a href="class.mongodb-bson-unserializable.php" class="interfacename">MongoDB\BSON\Unserializable</a></span>
         </p>
        </dd>
       
       
        <dt>OurClass</dt>
        <dd>
         <p class="para">
          qui implémente
          <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span>
         </p>
        </dd>
       
       
        <dt>TheirClass</dt>
        <dd>
         <p class="para">
          qui étend OurClass
         </p>
        </dd>
       
      </dl>
     </p>

     <p class="para">
      La méthode <span class="methodname"><a href="mongodb-bson-unserializable.bsonunserialize.php" class="methodname">MongoDB\BSON\Unserializable::bsonUnserialize()</a></span>
      d&#039;YourClass, OurClass, TheirClass itère sur le tableau et définit les
      propriétés sans modifications. Elle <em>ajoute aussi</em> la
      propriété <code class="literal">$unserialized</code> à <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>:

      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">bsonUnserialize</span><span style="color: #007700">( array </span><span style="color: #0000BB">$map </span><span style="color: #007700">)<br />{<br />    foreach ( </span><span style="color: #0000BB">$map </span><span style="color: #007700">as </span><span style="color: #0000BB">$k </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$value </span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">$k </span><span style="color: #007700">= </span><span style="color: #0000BB">$value</span><span style="color: #007700">;<br />    }<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">unserialized </span><span style="color: #007700">= </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />}</span></span></code></div>
      </div>

     </p>

     <p class="para">
      <div class="example-contents">
<div class="textcode"><pre class="textcode">/* typemap: [] (all defaults) */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;bar&quot; : false }
  -&gt; stdClass { $foo =&gt; &#039;yes&#039;, $bar =&gt; false }

{ &quot;foo&quot;: &quot;no&quot;, &quot;array&quot; : [ 5, 6 ] }
  -&gt; stdClass { $foo =&gt; &#039;no&#039;, $array =&gt; [ 5, 6 ] }

{ &quot;foo&quot;: &quot;no&quot;, &quot;obj&quot; : { &quot;embedded&quot; : 3.14 } }
  -&gt; stdClass { $foo =&gt; &#039;no&#039;, $obj =&gt; stdClass { $embedded =&gt; 3.14 } }

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: &quot;MyClass&quot; }
  -&gt; stdClass { $foo =&gt; &#039;yes&#039;, $__pclass =&gt; &#039;MyClass&#039; }

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: { &quot;$type&quot; : &quot;80&quot;, &quot;$binary&quot; : &quot;MyClass&quot; } }
  -&gt; stdClass { $foo =&gt; &#039;yes&#039;, $__pclass =&gt; Binary(0x80, &#039;MyClass&#039;) }

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: { &quot;$type&quot; : &quot;80&quot;, &quot;$binary&quot; : &quot;YourClass&quot;) }
  -&gt; stdClass { $foo =&gt; &#039;yes&#039;, $__pclass =&gt; Binary(0x80, &#039;YourClass&#039;) }

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: { &quot;$type&quot; : &quot;80&quot;, &quot;$binary&quot; : &quot;OurClass&quot;) }
  -&gt; OurClass { $foo =&gt; &#039;yes&#039;, $__pclass =&gt; Binary(0x80, &#039;OurClass&#039;), $unserialized =&gt; true }

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: { &quot;$type&quot; : &quot;44&quot;, &quot;$binary&quot; : &quot;YourClass&quot;) }
  -&gt; stdClass { $foo =&gt; &#039;yes&#039;, $__pclass =&gt; Binary(0x44, &#039;YourClass&#039;) }</pre>
</div>
      </div>

     </p>

     <p class="para">
      <div class="example-contents">
<div class="textcode"><pre class="textcode">/* typemap: [ &quot;root&quot; =&gt; &quot;MissingClass&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot; }
  -&gt; MongoDB\Driver\Exception\InvalidArgumentException(&quot;MissingClass does not exist&quot;)

/* typemap: [ &quot;root&quot; =&gt; &quot;MyClass&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;MyClass&quot; } }
  -&gt; MongoDB\Driver\Exception\InvalidArgumentException(&quot;MyClass does not implement Unserializable interface&quot;)

/* typemap: [ &quot;root&quot; =&gt; &quot;MongoDB\BSON\Unserializable&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot; }
  -&gt; MongoDB\Driver\Exception\InvalidArgumentException(&quot;Unserializable is not a concrete class&quot;)

/* typemap: [ &quot;root&quot; =&gt; &quot;YourClass&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;MongoDB\BSON\Unserializable&quot; } }
  -&gt; YourClass { $foo =&gt; &quot;yes&quot;, $__pclass =&gt; Binary(0x80, &quot;MongoDB\BSON\Unserializable&quot;), $unserialized =&gt; true }

/* typemap: [ &quot;root&quot; =&gt; &quot;YourClass&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;MyClass&quot; } }
  -&gt; YourClass { $foo =&gt; &quot;yes&quot;, $__pclass =&gt; Binary(0x80, &quot;MyClass&quot;), $unserialized =&gt; true }

/* typemap: [ &quot;root&quot; =&gt; &quot;YourClass&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;OurClass&quot; } }
  -&gt; OurClass { $foo =&gt; &quot;yes&quot;, $__pclass =&gt; Binary(0x80, &quot;OurClass&quot;), $unserialized =&gt; true }

/* typemap: [ &quot;root&quot; =&gt; &quot;YourClass&quot; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;TheirClass&quot; } }
  -&gt; TheirClass { $foo =&gt; &quot;yes&quot;, $__pclass =&gt; Binary(0x80, &quot;TheirClass&quot;), $unserialized =&gt; true }

/* typemap: [ &quot;root&quot; =&gt; &quot;OurClass&quot; ] */
{ foo: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;TheirClass&quot; } }
  -&gt; TheirClass { $foo =&gt; &quot;yes&quot;, $__pclass =&gt; Binary(0x80, &quot;TheirClass&quot;), $unserialized =&gt; true }</pre>
</div>
      </div>

     </p>

     <p class="para">
      <div class="example-contents">
<div class="textcode"><pre class="textcode">/* typemap: [ &#039;root&#039; =&gt; &#039;YourClass&#039; ] */
{ foo: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;YourClass&quot; } }
  -&gt; YourClass { $foo =&gt; &#039;yes&#039;, $__pclass =&gt; Binary(0x80, &#039;YourClass&#039;), $unserialized =&gt; true }</pre>
</div>
      </div>

     </p>

     <p class="para">
      <div class="example-contents">
<div class="textcode"><pre class="textcode">/* typemap: [ &#039;root&#039; =&gt; &#039;array&#039;, &#039;document&#039; =&gt; &#039;array&#039; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;bar&quot; : false }
  -&gt; [ &quot;foo&quot; =&gt; &quot;yes&quot;, &quot;bar&quot; =&gt; false ]

{ &quot;foo&quot;: &quot;no&quot;, &quot;array&quot; : [ 5, 6 ] }
  -&gt; [ &quot;foo&quot; =&gt; &quot;no&quot;, &quot;array&quot; =&gt; [ 5, 6 ] ]

{ &quot;foo&quot;: &quot;no&quot;, &quot;obj&quot; : { &quot;embedded&quot; : 3.14 } }
  -&gt; [ &quot;foo&quot; =&gt; &quot;no&quot;, &quot;obj&quot; =&gt; [ &quot;embedded =&gt; 3.14 ] ]

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: &quot;MyClass&quot; }
  -&gt; [ &quot;foo&quot; =&gt; &quot;yes&quot;, &quot;__pclass&quot; =&gt; &quot;MyClass&quot; ]

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;MyClass&quot; } }
  -&gt; [ &quot;foo&quot; =&gt; &quot;yes&quot;, &quot;__pclass&quot; =&gt; Binary(0x80, &quot;MyClass&quot;) ]

{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot; : { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;OurClass&quot; } }
  -&gt; [ &quot;foo&quot; =&gt; &quot;yes&quot;, &quot;__pclass&quot; =&gt; Binary(0x80, &quot;OurClass&quot;) ]</pre>
</div>
      </div>

     </p>

     <p class="para">
      <div class="example-contents">
<div class="textcode"><pre class="textcode">/* typemap: [ &#039;root&#039; =&gt; &#039;object&#039;, &#039;document&#039; =&gt; &#039;object&#039; ] */
{ &quot;foo&quot;: &quot;yes&quot;, &quot;__pclass&quot;: { &quot;$type&quot;: &quot;80&quot;, &quot;$binary&quot;: &quot;MyClass&quot; } }
  -&gt; stdClass { $foo =&gt; &quot;yes&quot;, &quot;__pclass&quot; =&gt; Binary(0x80, &quot;MyClass&quot;) }</pre>
</div>
      </div>

     </p>

   </div>
  </div>

 </div><?php manual_footer($setup); ?>