codecamp

PHP8 MongoDB序列化为BSON系列化

阵 列

如果数组是打包数组,即空数组或 键从 0 开始,是连续的,没有间隙:BSON 数组。

如果数组未打包(即具有关联(字符串)键,则 键不从 0 开始,或者当有间隙时:: BSON 对象

顶级(根)文档,始终序列化为 BSON文件。

例子

它们序列化为 BSON 数组:

[ 8, 5, 2, 3 ] => [ 8, 5, 2, 3 ]
[ 0 => 4, 1 => 9 ] => [ 4, 9 ]

这些序列化为 BSON 文档:

[ 0 => 1, 2 => 8, 3 => 12 ] => { "0" : 1, "2" : 8, "3" : 12 }
[ "foo" => 42 ] => { "foo" : 42 }
[ 1 => 9, 0 => 10 ] => { "1" : 9, "0" : 10 }

请注意,这五个示例是完整 文档,并且仅表示 公文。

对象

如果对象属于 stdClass 类,则序列化 作为 BSON 文档。

如果对象是实现 MongoDB\BSON\Type 的受支持类,则使用 BSON 该特定类型的序列化逻辑。MongoDB\BSON\Type 实例(不包括 MongoDB\BSON\Serializable)可能只有 序列化为文档字段值。尝试序列化这样的 对象作为根文档将抛出 MongoDB\Driver\Exception\UnexpectedValueException

如果对象属于实现 MongoDB\BSON\Type 接口的未知类,则抛出 MongoDB\Driver\Exception\UnexpectedValueException

如果对象属于任何其他类,则不实现任何特殊 接口,序列化为BSON文档。仅保留公共属性,忽略受保护的私有属性。

如果对象属于实现 MongoDB\BSON\Serializable 接口的类,请调用 MongoDB\BSON\Serializable::bsonSerialize() 并使用 返回的数组或 stdClass 序列化为 BSON 文档或数组。BSON 类型将由以下因素决定:

  1. 根文档必须序列化为 BSON 公文。
  2. MongoDB\BSON\Persistable 对象必须是 序列化为 BSON 文档。
  3. 如果 MongoDB\BSON\Serializable::bsonSerialize() 返回打包数组,则序列化为 BSON 数组。
  4. 如果 MongoDB\BSON\Serializable::bsonSerialize() 返回非打包数组或 stdClass, 序列化为 BSON 文档。
  5. 如果 MongoDB\BSON\Serializable::bsonSerialize() 未返回数组或 stdClass,则引发 MongoDB\Driver\Exception\UnexpectedValueException 异常。

如果对象属于实现 MongoDB\BSON\Persistable 接口的类( 表示 MongoDB\BSON\Serializable),获取 属性以与前面段落类似的方式,但也添加了一个附加属性__pclass作为二进制值,其中子类型和数据带有完全限定的类名 正在序列化的对象。0x80

将 __pclass 属性添加到数组中,或者 MongoDB\BSON\Serializable::bsonSerialize() 返回的对象,其中 表示它将覆盖任何__pclass键/属性 MongoDB\BSON\Serializable::bsonSerialize() 返回值。如果要避免此行为并设置自己的 __pclass 值,则不能实现 MongoDB\BSON\Persistable 和 应该直接实现 MongoDB\BSON\Serializable

例子

<?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(): array {
      return [ 'foo' => $this->foo, 'prot' => $this->prot ];
  }
} // => { "foo" : 42, "prot" : "wine" }

class AnotherClass2 implements MongoDB\BSON\Serializable {
  public $foo = 42;
  function bsonSerialize(): self {
      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(): array {
      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(): array {
      return $this->elements;
    }
  }
  function bsonSerialize(): array {
      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(): array {
      return array_values($this->elements);
    }
  }
  function bsonSerialize(): array {
      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(): array {
      return (object) $this->elements;
    }
  }
  function bsonSerialize(): array {
      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(): array {
      return [ 'foo' => $this->foo, 'prot' => $this->prot ];
  }
} // => { "foo" : 42, "prot" : "wine", "__pclass" : { "$type" : "80", "$binary" : "VXBwZXJDbGFzcw==" } }
PHP8 MongoDB连接处理和持久性
PHP8 MongoDB BSON 的反序列化
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PHP8 语言参考

PHP8 函数参考

PHP8 影响 PHP 行为的扩展

PHP8 Componere

PHP8 安装/配置

PHP8 外部函数接口

PHP8 选项和信息

PHP8 选项/信息 函数

PHP8 Windows Cache for PHP

PHP8 WinCache 函数

PHP8 Yac

PHP8 身份认证服务

PHP8 Radius 函数

PHP8 压缩与归档扩展

PHP8 Phar

PHP8 Zip

PHP8 ZipArchive 类

PHP8 加密扩展

PHP8 OpenSSL

PHP8 OpenSSL 函数

PHP8 Sodium 函数

PHP8 数据库扩展

PHP8 针对各数据库系统对应的扩展

PHP8 CUBRID 函数

PHP8 Firebird/InterBase

PHP8 Firebird/InterBase函数

PHP8 MongoDB介绍驱动程序体系结构和特殊功能

PHP8 MongoDB\Driver\Command 类

PHP8 MongoDB\Driver\Query 类

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }