|  | 
 
   Serialization to BSON
    Arrays
     If an array is a packed array — i.e. the keys start
     at 0 and are sequential without gaps: BSON array. 
     
     If the array is not packed — i.e. having associative (string) keys, the
     keys don't start at 0, or when there are gaps:: BSON
     object
     
     A top-level (root) document, always serializes as a
     BSON document.
     
     Examples
      These serialize as a BSON array:
      
[ 8, 5, 2, 3 ] => [ 8, 5, 2, 3 ]
[ 0 => 4, 1 => 9 ] => [ 4, 9 ] 
      These serialize as a BSON document:
      
[ 0 => 1, 2 => 8, 3 => 12 ] => { "0" : 1, "2" : 8, "3" : 12 }
[ "foo" => 42 ] => { "foo" : 42 }
[ 1 => 9, 0 => 10 ] => { "1" : 9, "0" : 10 } 
      Note that the five examples are extracts of a full
      document, and represent only one value inside a
      document.
      
    Objects
      If an object is of the stdClass class, serialize
      as a BSON document.
      
      If an object is a supported class that implements
      MongoDB\BSON\Type, then use the BSON
      serialization logic for that specific type.
      MongoDB\BSON\Type instances (excluding
      MongoDB\BSON\Serializable may only be serialized
      as a document field value. Attempting to serialize such an object as a
      root document will throw a
      MongoDB\Driver\Exception\UnexpectedValueException
      
      If an object is of an unknown class implementing the
      MongoDB\BSON\Type interface, then throw a
      MongoDB\Driver\Exception\UnexpectedValueException
      
      If an object is of any other class, without implementing any special
      interface, serialize as a BSON document. Keep only
      public properties, and ignore
      protected and private
      properties.
      
      If an object is of a class that implements the
      MongoDB\BSON\Serializable interface, call
       MongoDB\BSON\Serializable::bsonSerialize and use
      the returned array or stdClass to serialize as a
      BSON document or array. The BSON type will be determined by the following:
      
       
       
        Root documents must be serialized as a BSON
        document.
        
        MongoDB\BSON\Persistable objects must be
        serialized as a BSON document.
        
        
         If  MongoDB\BSON\Serializable::bsonSerialize
         returns a packed array, serialize as a BSON array.
        
        
         If  MongoDB\BSON\Serializable::bsonSerialize
         returns a non-packed array or stdClass,
         serialize as a BSON document.
        
        
         If  MongoDB\BSON\Serializable::bsonSerialize
         did not return an array or stdClass, throw an
         MongoDB\Driver\Exception\UnexpectedValueException
         exception.
         
      If an object is of a class that implements the
      MongoDB\BSON\Persistable interface (which implies
      MongoDB\BSON\Serializable obtain the properties
      in a similar way as in the previous paragraphs, but
      also add an additional property
      __pclass as a Binary value, with subtype
      0x80 and data bearing the fully qualified class name
      of the object that is being serialized.
      
      The __pclass property is added to the array or
      object returned by
       MongoDB\BSON\Serializable::bsonSerialize, which
      means it will overwrite any __pclass key/property in
      the  MongoDB\BSON\Serializable::bsonSerialize
      return value. If you want to avoid this behaviour and set your own
      __pclass value, you must not
      implement MongoDB\BSON\Persistable and should
      instead implement MongoDB\BSON\Serializable
      directly.
      
      Examples
<?php
 class stdClass {
 public $foo = 42;
 } // => { "foo" : 42 }
 
 class MyClass {
 public $foo = 42;
 protected $prot = "wine";
 private $fpr = "cheese";
 } // => { "foo" : 42 }
 
 class AnotherClass1 implements MongoDB\BSON\Serializable {
 public $foo = 42;
 protected $prot = "wine";
 private $fpr = "cheese";
 function bsonSerialize() {
 return [ 'foo' => $this->foo, 'prot' => $this->prot ];
 }
 } // => { "foo" : 42, "prot" : "wine" }
 
 class AnotherClass2 implements MongoDB\BSON\Serializable {
 public $foo = 42;
 function bsonSerialize() {
 return $this;
 }
 } // => MongoDB\Driver\Exception\UnexpectedValueException("bsonSerialize() did not return an array or stdClass")
 
 class AnotherClass3 implements MongoDB\BSON\Serializable {
 private $elements = [ 'foo', 'bar' ];
 function bsonSerialize() {
 return $this->elements;
 }
 } // => { "0" : "foo", "1" : "bar" }
 
 class ContainerClass implements MongoDB\BSON\Serializable {
 public $things = AnotherClass4 implements MongoDB\BSON\Serializable {
 private $elements = [ 0 => 'foo', 2 => 'bar' ];
 function bsonSerialize() {
 return $this->elements;
 }
 }
 function bsonSerialize() {
 return [ 'things' => $this->things ];
 }
 } // => { "things" : { "0" : "foo", "2" : "bar" } }
 
 class ContainerClass implements MongoDB\BSON\Serializable {
 public $things = AnotherClass5 implements MongoDB\BSON\Serializable {
 private $elements = [ 0 => 'foo', 2 => 'bar' ];
 function bsonSerialize() {
 return array_values($this->elements);
 }
 }
 function bsonSerialize() {
 return [ 'things' => $this->things ];
 }
 } // => { "things" : [ "foo", "bar" ] }
 
 class ContainerClass implements MongoDB\BSON\Serializable {
 public $things = AnotherClass6 implements MongoDB\BSON\Serializable {
 private $elements = [ 'foo', 'bar' ];
 function bsonSerialize() {
 return (object) $this->elements;
 }
 }
 function bsonSerialize() {
 return [ 'things' => $this->things ];
 }
 } // => { "things" : { "0" : "foo", "1" : "bar" } }
 
 class UpperClass implements MongoDB\BSON\Persistable {
 public $foo = 42;
 protected $prot = "wine";
 private $fpr = "cheese";
 function bsonSerialize() {
 return [ 'foo' => $this->foo, 'prot' => $this->prot ];
 }
 } // => { "foo" : 42, "prot" : "wine", "__pclass" : { "$type" : "80", "$binary" : "VXBwZXJDbGFzcw==" } }
 |