<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'mongodb.persistence.php',
    1 => 'Persistir datos',
    2 => 'Serializaci&oacute;n y deserializaci&oacute;n de variables PHP en MongoDB',
  ),
  'up' => 
  array (
    0 => 'mongodb.architecture.php',
    1 => 'Arquitectura y funcionalidades especiales',
  ),
  'prev' => 
  array (
    0 => 'mongodb.connection-handling.php',
    1 => 'Conexiones',
  ),
  'next' => 
  array (
    0 => 'mongodb.security.php',
    1 => 'Seguridad',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Serialización y deserialización de variables PHP en MongoDB</h2>

  <p class="para">
   Este documento explica cómo se convierten las estructuras compuestas (es decir, los
   documentos, los arrays y los objetos) entre los valores BSON y PHP.
  </p>

  <div class="section" id="mongodb.persistence.serialization">
   <h2 class="title">Serialización en BSON</h2>

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

    <p class="para">
     Si un array es un <em>array compacto</em> — es decir, un
     array vacío o las claves comienzan en 0 y son secuenciales sin huecos :
     <em>array BSON</em>.
    </p>

    <p class="para">
     Si el array no es compacto — es decir, que tiene claves
     asociativas (cadenas), que las claves no comienzan en 0, o que hay
     huecos : <em>objeto BSON</em>.
    </p>

    <p class="para">
     Un documento de nivel superior (raíz), <em>siempre</em>
     serializado como documento BSON.
    </p>

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

     <p class="para">
      Estos ejemplos se serializan como array 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">
      Estos ejemplos se serializan como objeto 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">
      Es de notar que los cinco ejemplos son <em>extractos</em>
      de un documento completo, y solo representan un <em>valor</em>
      dentro de un documento.
     </p>

    </div>
   </div>

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

     <p class="para">
      Si un objeto es de la clase <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>, serializar
      como <em>documento BSON</em>.
     </p>

     <p class="para">
      Si un objeto es una clase soportada que implementa
      <span class="interfacename"><a href="class.mongodb-bson-type.php" class="interfacename">MongoDB\BSON\Type</a></span>, entonces utilizar la lógica
      de serialización BSON para este tipo específico.
      Las instancias de <span class="interfacename"><a href="class.mongodb-bson-type.php" class="interfacename">MongoDB\BSON\Type</a></span> (a
      excepción de <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span>)
      solo pueden ser serializadas como valor de campo de documento. Intentar
      serializar tal objeto como documento raíz lanzará una
      <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 objeto es de una clase desconocida que implementa la interfaz
      <span class="interfacename"><a href="class.mongodb-bson-type.php" class="interfacename">MongoDB\BSON\Type</a></span>, entonces se lanza una
      <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 objeto es de otra clase, sin implementar una interfaz especial,
      serializar como <em>documento BSON</em>. Mantener solo
      las propiedades <em>públicas</em>, e ignorar las propiedades
      <em>protegidas</em> y <em>privadas</em>.
     </p>

     <p class="para">
      Si un objeto es de una clase que implementa
      <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span>, llamar
      <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span> y
      utilizar el array o <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span> devuelto para
      serializar como documento BSON o array. El tipo BSON será
      determinado por las siguientes reglas :
     </p>

     <p class="para">
      <ol type="1">
       <li class="listitem">
        <p class="para">
         Los documentos raíz deben ser serializados como
         documento BSON.
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         Los objetos <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span> deben
         ser serializados como documento 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>
         devuelve un array compacto, serializar como array 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>
         devuelve un array no compacto o <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>, serializar como objeto 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>
         no devuelve un array o <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>, lanzar una excepción
         <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 objeto es de una clase que implementa la interfaz
      <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span> (lo que implica
      <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span>), obtener las
      propiedades de manera similar a los párrafos anteriores, pero
      <em>también</em> añadir una propiedad
      <span class="property">__pclass</span> como valor binario, con un subtipo
      <code class="literal">0x80</code> y datos que llevan el nombre de la clase
      completamente calificado del objeto que se serializa.
     </p>

     <p class="para">
      La propiedad <span class="property">__pclass</span> se añade al array o al
      objeto devuelto por
      <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>, lo que
      significa que sobrescribirá cualquier clave/propiedad <span class="property">__pclass</span>
      en el valor de retorno de
      <span class="methodname"><a href="mongodb-bson-serializable.bsonserialize.php" class="methodname">MongoDB\BSON\Serializable::bsonSerialize()</a></span>. Si se
      desea evitar este comportamiento y definir su propio valor
      <span class="property">__pclass</span>,
      no se debe <em>implementar</em>
      <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span> y se debería implementar
      <span class="interfacename"><a href="class.mongodb-bson-serializable.php" class="interfacename">MongoDB\BSON\Serializable</a></span> directamente.
     </p>

     <div class="section">
      <h2 class="title">Ejemplos</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 /></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"} como clase raíz<br />  //        ["foo", "bar"] como valor anidado<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 /></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">Deserialización desde BSON</h2>

   
 <div class="warning"><strong class="warning">Advertencia</strong>
 <p class="simpara">
 Los documentos BSON pueden contener técnicamente claves duplicadas ya que
 los documentos se almacenan como una lista de pares clave-valor;
 sin embargo, las aplicaciones deben abstenerse de generar
 documentos con claves duplicadas ya que el comportamiento del servidor y del
 controlador puede ser indefinido. Dado que los objetos y arrays de PHP no pueden
 tener claves duplicadas, los datos también podrían perderse al decodificar
 un documento BSON con claves duplicadas.
 </p>
 </div>
 

   <p class="para">
    La extensión <code class="code">mongodb</code> deserializa los documentos BSON
    y los arrays BSON como arrays PHP. Aunque los arrays PHP son
    prácticos de usar, este comportamiento era problemático ya que diferentes
    tipos BSON podían ser deserializados en el mismo valor PHP (por ejemplo
    <code class="literal">{&quot;0&quot;: &quot;foo&quot;}</code> y <code class="literal">[&quot;foo&quot;]</code>) y hacía
    imposible inferir el tipo BSON original. Por defecto, la extensión
    <code class="code">mongodb</code> aborda esta preocupación asegurándose de que los
    arrays BSON y los documentos BSON se conviertan en arrays y objetos PHP,
    respectivamente.
   </p>
   <p class="para">
    Para los tipos compuestos, existen tres tipos de datos :
   </p>

   <p class="para">
    <dl>
     
      <dt>raíz</dt>
      <dd>
       <p class="para">
        se refiere a un documento BSON de nivel superior <em>solo</em>
       </p>
      </dd>
     
     
      <dt>documento</dt>
      <dd>
       <p class="para">
        se refiere a documentos BSON anidados <em>solo</em>
       </p>
      </dd>
     
     
      <dt>array</dt>
      <dd>
       <p class="para">
        se refiere a un array BSON
       </p>
      </dd>
     
    </dl>
   </p>

   <p class="para">
    Además de los tres tipos colectivos, también es posible configurar campos específicos en su documento para mapear los tipos de datos
    mencionados a continuación. Por ejemplo, el siguiente tipo de mapa le permite mapear cada documento incrustado en un array <code class="literal">&quot;addresses&quot;</code> a una clase <span class="classname"><strong class="classname">Address</strong></span> <em>y</em> cada
    campo <code class="literal">&quot;city&quot;</code> en estos documentos de dirección incrustados a una
    clase <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">
    Cada uno de estos tres tipos de datos, así como los mapeos específicos
    de los campos, pueden ser mapeados contra diferentes tipos PHP. Los valores de
    mapeo posibles son:
   </p>

   <p class="para">
    <dl>
     
      <dt><em>no definido</em> o <span class="type"><a href="language.types.null.php" class="type NULL">NULL</a></span> (por defecto)</dt>
      <dd>
       <p class="para">
        <ul class="itemizedlist">
         <li class="listitem">
          <p class="para">
           Un array BSON será deserializado 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 documento BSON (raíz o anidado) sin propiedad
            <span class="property">__pclass</span>
            <a href="#fnidmongodb.pclass" name="fnmongodb.pclass"><sup>[1]</sup></a>
            
           
           se convierte en un objeto <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>, con cada clave de documento
           BSON definida como una propiedad de <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>
           pública.
          </p>
         </li>
         <li class="listitem">
          <p class="para">
           Un documento BSON (raíz o anidado) con una propiedad
           <span class="property">__pclass</span> se convierte en un objeto PHP de la clase
           nombrada por la propiedad <span class="property">__pclass</span>.
          </p>
          <p class="para">
           Si la clase nombrada implementa la interfaz
           <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span>, entonces las
           propiedades del documento BSON, incluyendo la propiedad
           <span class="property">__pclass</span>, se envían como array asociativo a la función
           <span class="methodname"><a href="mongodb-bson-unserializable.bsonunserialize.php" class="methodname">MongoDB\BSON\Unserializable::bsonUnserialize()</a></span>
           para inicializar las propiedades del objeto.
          </p>
          <p class="para">
           Si la clase nombrada no existe o no implementa la interfaz
           <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> será
           utilizado y cada clave de documento BSON (incluyendo <span class="property">__pclass</span>)
           será definida como una propiedad pública de <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>.
          </p>
          <p class="para">
           La funcionalidad <span class="property">__pclass</span> se basa en el hecho
           de que la propiedad sea parte de un documento MongoDB recuperado. Si utiliza una
           <a href="mongodb-driver-query.construct.php#mongodb-driver-query.construct-queryOptions" class="link">proyección</a>
           al buscar documentos, debe incluir el campo
           <span class="property">__pclass</span> en la proyección para que esta
           funcionalidad funcione.
          </p>
         </li>
        </ul>
       </p>
      </dd>
     

     
      <dt><code class="literal">&quot;array&quot;</code></dt>
      <dd>
       <p class="para">
        Transforma un array BSON en un <span class="type"><a href="language.types.array.php" class="type array">array</a></span> PHP. No habrá
        tratamiento especial de una propiedad <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a>
        pero puede ser definida como un elemento en el array devuelto
        si estaba presente en el documento BSON.
       </p>
      </dd>
     

     
      <dt><code class="literal">&quot;object&quot;</code> o <code class="literal">&quot;stdClass&quot;</code></dt>
      <dd>
       <p class="para">
        Transforma un array BSON o un documento BSON en un objeto
        <span class="type"><a href="class.stdclass.php" class="type stdClass">stdClass</a></span>. No habrá tratamiento especial de una
        propiedad <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a>
        pero puede ser definida como una propiedad pública en el objeto
        devuelto si estaba presente en el documento BSON.
       </p>
      </dd>
     

     
      <dt><code class="literal">&quot;bson&quot;</code></dt>
      <dd>
       <p class="para">
        Transforma un array BSON en un <span class="classname"><a href="class.mongodb-bson-packedarray.php" class="classname">MongoDB\BSON\PackedArray</a></span>
        y un documento BSON en un <span class="classname"><a href="class.mongodb-bson-document.php" class="classname">MongoDB\BSON\Document</a></span>,
        independientemente de si el documento BSON tiene una propiedad
        <span class="property">__pclass</span> <a href="#fnidmongodb.pclass"><sup>[1]</sup></a>.
       </p>
       <blockquote class="note"><p><strong class="note">Nota</strong>: 
        <span class="simpara">
         El valor <code class="literal">bson</code> solo está disponible para los tres
         tipos raíz, y no en los mapeos específicos de los campos.
        </span>
       </p></blockquote>
      </dd>
     

     
      <dt>todas las otras cadenas de caracteres</dt>
      <dd>
       <p class="para">
        Define el nombre de la clase a la que el documento BSON debe ser
        deserializado. Para los documentos BSON que incluyen propiedades
        <span class="property">__pclass</span>,
        esta clase tendrá prioridad.
       </p>

       <p class="para">
        Si la clase nombrada no existe o no implementa la interfaz
        <span class="interfacename"><a href="class.mongodb-bson-unserializable.php" class="interfacename">MongoDB\BSON\Unserializable</a></span>,
        se lanza una excepción
        <span class="classname"><a href="class.mongodb-driver-exception-invalidargumentexception.php" class="classname">MongoDB\Driver\Exception\InvalidArgumentException</a></span>.
       </p>

       <p class="para">
        Si el objeto BSON tiene una propiedad <span class="property">__pclass</span> y
        esta clase existe e implementa
        <span class="interfacename"><a href="class.mongodb-bson-persistable.php" class="interfacename">MongoDB\BSON\Persistable</a></span>, tendrá
        prioridad sobre la clase proporcionada en el mapa de tipos.
       </p>

       <p class="para">
        Las propiedades del documento BSON, <em>incluyendo</em> la propiedad
        <span class="property">__pclass</span>,
        serán enviadas como array asociativo a la función
        <span class="methodname"><a href="mongodb-bson-unserializable.bsonunserialize.php" class="methodname">MongoDB\BSON\Unserializable::bsonUnserialize()</a></span>
        para inicializar las propiedades del objeto.
       </p>
      </dd>
     
    </dl>
   </p>

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

     <p class="para">
      Los TypeMaps pueden ser definidos a través del método
      <span class="methodname"><a href="mongodb-driver-cursor.settypemap.php" class="methodname">MongoDB\Driver\Cursor::setTypeMap()</a></span> en un objeto
      <span class="classname"><a href="class.mongodb-driver-cursor.php" class="classname">MongoDB\Driver\Cursor</a></span>, o el argumento
      <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>, y
      <span class="methodname"><a href="mongodb-bson-packedarray.tophp.php" class="methodname">MongoDB\BSON\PackedArray::toPHP()</a></span>. Cada una de las tres
      clases (<em>raíz</em>, <em>documento</em>, y
      <em>array</em>) puede ser definida individualmente, además de los
      tipos específicos de los campos.
     </p>

     <p class="para">
      Si el valor en el TypeMap es <span class="type"><a href="language.types.null.php" class="type NULL">NULL</a></span>, esto significa lo mismo que el valor <em>por defecto</em> para este elemento.
     </p>
    </div>

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

     <p class="para">
      Estos ejemplos utilizan las siguientes clases:
     </p>

     <p class="para">
      <dl>
       
        <dt>MyClass</dt>
        <dd>
         <p class="para">
          que no implementa <em>ninguna</em> interfaz
         </p>
        </dd>
       
       
        <dt>YourClass</dt>
        <dd>
         <p class="para">
          que implementa
          <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">
          que implementa
          <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">
          que extiende OurClass
         </p>
        </dd>
       
      </dl>
     </p>

     <p class="para">
      El método <span class="methodname"><a href="mongodb-bson-unserializable.bsonunserialize.php" class="methodname">MongoDB\BSON\Unserializable::bsonUnserialize()</a></span>
      de YourClass, OurClass, TheirClass itera sobre el array y define las
      propiedades sin modificaciones. También <em>añade</em> la
      propiedad <code class="literal">$unserialized</code> a <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: [] (todos los valores por defecto) */
{ &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); ?>