БСриализация ΠΈ дСсСриализация PHP-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ MongoDB

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ обсуТдаСтся, ΠΊΠ°ΠΊ составныС структуры Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², массивов ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° BSON ΠΈ PHP-значСниями.

БСриализация Π² BSON

ΠœΠ°ΡΡΠΈΠ²Ρ‹

Если массив прСдставляСт собой ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ пустой массив ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с 0 ΠΈ ΠΈΠ΄ΡƒΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²: BSON-массив.

Если массив Π½Π΅ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½ β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ содСрТит ассоциативныС (строковыС) ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с 0 ΠΈΠ»ΠΈ содСрТат ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹: BSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ) всСгда сСриализуСтся ΠΊΠ°ΠΊ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π­Ρ‚ΠΈ PHP-массивы ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ BSON-массив:

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

Π­Ρ‚ΠΈ PHP-массивы ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ 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-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚. ΠžΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ (public) свойства, Π° Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹Π΅ (protected) ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ (private) свойства ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MongoDB\BSON\Serializable, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ MongoDB\BSON\Serializable::bsonSerialize() ΠΈ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ массив ΠΈΠ»ΠΈ stdClass, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠ°ΠΊ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ 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 Π² Π²ΠΈΠ΄Π΅ Binary-значСния с ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠΌ 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 = 'Π²ΠΈΠ½ΠΎ';
private
$fpr = 'сыр';
}
// => {"foo": 42}

class AnotherClass1 implements MongoDB\BSON\Serializable
{
public
$foo = 42;
protected
$prot = 'Π²ΠΈΠ½ΠΎ';
private
$fpr = 'сыр';

public function
bsonSerialize(): array
{
return [
'foo' => $this->foo, 'prot' => $this->prot];
}
}
// => {"foo": 42, "prot": "Π²ΠΈΠ½ΠΎ"}

class AnotherClass2 implements MongoDB\BSON\Serializable
{
public
$foo = 42;

public 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'];

public function
bsonSerialize(): array
{
return
$this->elements;
}
}
// => {"0": "foo", "1": "bar"}

/**
* Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ сСриализуСмыС классы
*/

class AnotherClass4 implements MongoDB\BSON\Serializable
{
private
$elements = [0 => 'foo', 2 => 'bar'];

public function
bsonSerialize(): array
{
return
$this->elements;
}
}
// => {"0": "foo", "2": "bar"}

class ContainerClass1 implements MongoDB\BSON\Serializable
{
public
$things;

public function
__construct()
{
$this->things = new AnotherClass4();
}

function
bsonSerialize(): array
{
return [
'things' => $this->things];
}
}
// => {"things": {"0": "foo", "2": "bar"}}


class AnotherClass5 implements MongoDB\BSON\Serializable
{
private
$elements = [0 => 'foo', 2 => 'bar'];

public function
bsonSerialize(): array
{
return
array_values($this->elements);
}
}
// => {"0": "foo", "1": "bar"} as a root class
// ["foo", "bar"] as a nested value

class ContainerClass2 implements MongoDB\BSON\Serializable
{
public
$things;

public function
__construct()
{
$this->things = new AnotherClass5();
}

public function
bsonSerialize(): array
{
return [
'things' => $this->things];
}
}
// => {"things": ["foo", "bar"]}


class AnotherClass6 implements MongoDB\BSON\Serializable
{
private
$elements = ['foo', 'bar'];

function
bsonSerialize(): object
{
return (object)
$this->elements;
}
}
// => {"0": "foo", "1": "bar"}

class ContainerClass3 implements MongoDB\BSON\Serializable
{
public
$things;

public function
__construct()
{
$this->things = new AnotherClass6();
}

public function
bsonSerialize(): array
{
return [
'things' => $this->things];
}
}
// => {"things": {"0": "foo", "1": "bar"}}

class UpperClass implements MongoDB\BSON\Persistable
{
public
$foo = 42;
protected
$prot = 'Π²ΠΈΠ½ΠΎ';
private
$fpr = 'сыр';

private
$data;

public function
bsonUnserialize(array $data): void
{
$this->data = $data;
}

public function
bsonSerialize(): array
{
return [
'foo' => $this->foo, 'prot' => $this->prot];
}
}
// => {"foo": 42, "prot": "Π²ΠΈΠ½ΠΎ", "__pclass": {"$type": "80", "$binary": "VXBwZXJDbGFzcw=="}}

?>

ДСсСриализация ΠΈΠ· BSON

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ BSON тСхничСски ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ хранятся Π² Π²ΠΈΠ΄Π΅ списка ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; ΠΎΠ΄Π½Π°ΠΊΠΎ прилоТСниям слСдуСт Π²ΠΎΠ·Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ создания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ сСрвСра ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ массивы PHP Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ потСряны ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° BSON с ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.

Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ mongo дСсСриализовывал BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ BSON-массивы Π² PHP-массивы. Π₯отя с PHP-массивами ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·Π½Ρ‹Π΅ BSON-Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ PHP-значСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, {"0": "foo"} ΠΈ ["foo"]), Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ BSON-Ρ‚ΠΈΠΏΠ°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ mongodb Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ BSON-массивы ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² PHP-массивы, Π° BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² PHP-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Для составных Ρ‚ΠΈΠΏΠΎΠ² сущСствуСт Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…:

root
относится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня
document
относится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ встроСнным BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ
array
относится ΠΊ BSON-массивам

Помимо Ρ‚Ρ€Ρ‘Ρ… Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ поля Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ для сопоставлСния с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠ°Ρ€Ρ‚Π° Ρ‚ΠΈΠΏΠΎΠ² позволяСт ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ встроСнный Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² массивС Β«addressesΒ» с классом Address, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Β«cityΒ» Π² этих Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… с встроСнным адрСсом с классом City:

[
    'fieldPaths' => [
        'addresses.$' => 'MyProject\Address',
        'addresses.$.city' => 'MyProject\City',
    ],
]

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих Ρ‚Ρ€Ρ‘Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ сопоставлСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ PHP. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния сопоставлСния:

Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠ»ΠΈ NULL (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)

  • BSON-массив Π±ΡƒΠ΄Π΅Ρ‚ дСсСриализован ΠΊΠ°ΠΊ PHP-массив (array).
  • BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ встроСнный) Π±Π΅Π· свойства __pclass [1]

    Бвойство __pclass считаСтся ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли сущСствуСт свойство с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΈ ΠΎΠ½ΠΎ прСдставляСт собой Binary-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ Binary значСния Ρ€Π°Π²Π΅Π½ 0x80. Если ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· этих Ρ‚Ρ€Ρ‘Ρ… условий Π½Π΅ выполняСтся, свойство __pclass Π½Π΅ сущСствуСт ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ свойство.

    становится PHP-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ stdClass, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° устанавливаСтся ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ свойство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° stdClass.
  • BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ встроСнный) со свойством __pclass [1] становится PHP-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈΠΌΠ΅Π½ΠΈ класса, ΠΊΠ°ΠΊ это опрСдСляСт свойство __pclass. Если ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MMongoDB\BSON\Persistable, Ρ‚ΠΎ свойства BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ свойство __pclass, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ассоциативный массив Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ MongoDB\BSON\Unserializable::bsonUnserialize(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс Π½Π΅ сущСствуСт ΠΈΠ»ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MongoDB\BSON\Persistable, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ stdClass, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ свойство __pclass) Π±ΡƒΠ΄Π΅Ρ‚ установлСн ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ свойство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° stdClass. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ свойства __pclass зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, прСдставляСт Π»ΠΈ собой свойство Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Ρ‘Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π‘Π” MongoDB. Если ΠΏΡ€ΠΈ запросС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ проСкция, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ»Π΅ __pclass, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π»Π°.
Β«arrayΒ»
ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ BSON-массив ΠΈΠ»ΠΈ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² PHP-массив. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ свойства __pclass [1] Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ элСмСнт Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ массивС, Ссли ΠΎΠ½ содСрТался Π² BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅.
Β«objectΒ» ΠΈΠ»ΠΈ Β«stdClassΒ»
ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ BSON-массив ΠΈΠ»ΠΈ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ stdClass. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ свойства __pclass [1] Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ свойство Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Ссли ΠΎΠ½ΠΎ присутствовало Π² BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅.
Β«bsonΒ»
ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ BSON-массив Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MongoDB\BSON\PackedArray, Π° BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MongoDB\BSON\Document, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° свойство __pclass [1].

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ bson доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Ρ€Ρ‘Ρ… ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ Π½Π΅ Π² отобраТСниях для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

любая другая строка
ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ имя класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ BSON-массив ΠΈΠ»ΠΈ BSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Для BSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат свойства __pclass, этот класс Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ. Если ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс Π½Π΅ сущСствуСт, Π½Π΅ прСдставляСт собой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ класс (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ это абстрактный класс ΠΈΠ»ΠΈ интСрфСйс) ΠΈΠ»ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MongoDB\BSON\Unserializable, выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ MongoDB\Driver\Exception\InvalidArgumentException. Если BSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит свойство __pclass ΠΈ этот класс сущСствуСт ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MongoDB\BSON\Persistable, ΠΎΠ½ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ класс, прСдставлСнный Π² ΠΊΠ°Ρ€Ρ‚Π΅ Ρ‚ΠΈΠΏΠΎΠ². Бвойства BSON-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ свойство __pclass, Ссли ΠΎΠ½ΠΎ сущСствуСт, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ассоциативный массив Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ MongoDB\BSON\Unserializable::bsonUnserialize(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

TypeMaps

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ настройки TypeMaps ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ MongoDB\Driver\Cursor::setTypeMap() для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° MongoDB\Driver\Cursor ΠΈΠ»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° $typeMap Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… MongoDB\BSON\toPHP(), MongoDB\BSON\Document::toPHP() ΠΈ MongoDB\BSON\PackedArray::toPHP(). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… классов (root, document, ΠΈ array) ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎ, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ ΠΏΠΎΠ»Π΅ΠΉ.

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ Ρ€Π°Π²Π½ΠΎ NULL, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для этого элСмСнта.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π’ этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ классы:

MyClass
Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйсы
YourClass
Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MongoDB\BSON\Unserializable
OurClass
Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс MongoDB\BSON\Persistable
TheirClass
Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ класс OurClass

ΠœΠ΅Ρ‚ΠΎΠ΄ MongoDB\BSON\Unserializable::bsonUnserialize() классов YourClass, OurClass, OurClass выполняСт ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ массиву ΠΈ устанавливаСт свойства Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСт для свойства $unserialized Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true:

<?php

function bsonUnserialize(array $map)
{
foreach (
$map as $k => $value) {
$this->$k = $value;
}
$this->unserialized = true;
}

?>

/* typemap: [] (всС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) */
{"foo": "yes", "bar" : false}
  -> stdClass {$foo => 'yes', $bar => false}

{"foo": "no", "array" : [5, 6]}
  -> stdClass {$foo => 'no', $array => [5, 6]}

{"foo": "no", "obj" : {"embedded" : 3.14}}
  -> stdClass {$foo => 'no', $obj => stdClass {$embedded => 3.14}}

{"foo": "yes", "__pclass": "MyClass"}
  -> stdClass {$foo => 'yes', $__pclass => 'MyClass'}

{"foo": "yes", "__pclass": {"$type" : "80", "$binary" : "MyClass"}}
  -> stdClass {$foo => 'yes', $__pclass => Binary(0x80, 'MyClass')}

{"foo": "yes", "__pclass": {"$type" : "80", "$binary" : "YourClass")}
  -> stdClass {$foo => 'yes', $__pclass => Binary(0x80, 'YourClass')}

{"foo": "yes", "__pclass": {"$type" : "80", "$binary" : "OurClass")}
  -> OurClass {$foo => 'yes', $__pclass => Binary(0x80, 'OurClass'), $unserialized => true}

{"foo": "yes", "__pclass": {"$type" : "44", "$binary" : "YourClass")}
  -> stdClass {$foo => 'yes', $__pclass => Binary(0x44, 'YourClass')}

/* typemap: ["root" => "MissingClass"] */
{"foo": "yes"}
  -> MongoDB\Driver\Exception\InvalidArgumentException("MissingClass does not exist")

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

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

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

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

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

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

/* typemap: ["root" => "OurClass"] */
{ foo: "yes", "__pclass" : {"$type": "80", "$binary": "TheirClass"}}
  -> TheirClass {$foo => "yes", $__pclass => Binary(0x80, "TheirClass"), $unserialized => true}

/* typemap: ['root' => 'YourClass'] */
{foo: "yes", "__pclass": {"$type": "80", "$binary": "YourClass"}}
  -> YourClass {$foo => 'yes', $__pclass => Binary(0x80, 'YourClass'), $unserialized => true}

/* typemap: ['root' => 'array', 'document' => 'array'] */
{"foo": "yes", "bar": false}
  -> ["foo" => "yes", "bar" => false]

{"foo": "no", "array": [5, 6]}
  -> ["foo" => "no", "array" => [5, 6]]

{"foo": "no", "obj": {"embedded": 3.14}}
  -> ["foo" => "no", "obj" => ["embedded => 3.14]]

{"foo": "yes", "__pclass": "MyClass"}
  -> ["foo" => "yes", "__pclass" => "MyClass"]

{"foo": "yes", "__pclass": {"$type": "80", "$binary": "MyClass"}}
  -> ["foo" => "yes", "__pclass" => Binary(0x80, "MyClass")]

{"foo": "yes", "__pclass": {"$type": "80", "$binary": "OurClass"}}
  -> ["foo" => "yes", "__pclass" => Binary(0x80, "OurClass")]

/* typemap: ['root' => 'object', 'document' => 'object'] */
{"foo": "yes", "__pclass": {"$type": "80", "$binary": "MyClass"}}
  -> stdClass {$foo => "yes", "__pclass" => Binary(0x80, "MyClass")}
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы