Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ², ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΎΡΠΌΠ°ΡΠ° BSON ΠΈ PHP-Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ.
ΠΡΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² β ΡΠΎ Π΅ΡΡΡ ΠΏΡΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ»ΠΈ ΠΊΠ»ΡΡΠΈ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ 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 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ:
ΠΠΎΡΠ½Π΅Π²ΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ.
ΠΠ±ΡΠ΅ΠΊΡΡ Ρ ΡΠΈΠΏΠΎΠΌ MongoDB\BSON\Persistable ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ.
ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ MongoDB\BSON\Serializable::bsonSerialize() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², Π΅Π³ΠΎ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΡΡ ΠΊΠ°ΠΊ BSON-ΠΌΠ°ΡΡΠΈΠ².
ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ MongoDB\BSON\Serializable::bsonSerialize() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ stdClass, Π΅Π³ΠΎ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΡΡ ΠΊΠ°ΠΊ BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ.
ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ 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 ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠ΅ΡΡ ΠΊΠ»ΡΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΠ°Ρ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΠΎΠ·Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΎΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠ°ΠΌΠΈ ΠΊΠ»ΡΡΠ΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΌΠ°ΡΡΠΈΠ²Ρ PHP Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ, Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ ΠΏΡΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° BSON Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠΌΠΈΡΡ ΠΊΠ»ΡΡΠ°ΠΌΠΈ.
Π£ΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ mongo Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°Π»
BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ ΠΈ BSON-ΠΌΠ°ΡΡΠΈΠ²Ρ Π² PHP-ΠΌΠ°ΡΡΠΈΠ²Ρ. Π₯ΠΎΡΡ Ρ PHP-ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ
ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°Π·Π½ΡΠ΅
BSON-ΡΠΈΠΏΡ ΠΌΠΎΠ³Π»ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ PHP-Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
{"0": "foo"} ΠΈ ["foo"]), ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΎ
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ BSON-ΡΠΈΠΏΠ°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ mongodb
ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ BSON-ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡΡ Π² PHP-ΠΌΠ°ΡΡΠΈΠ²Ρ, Π° BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ
Π² PHP-ΠΎΠ±ΡΠ΅ΠΊΡΡ.
ΠΠ»Ρ ΡΠΎΡΡΠ°Π²Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠΈ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ :
ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ
ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΠΌ
ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ BSON-ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌ
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΡΡ
Π³ΡΡΠΏΠΏΠΎΠ²ΡΡ
ΡΠΈΠΏΠΎΠ², ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Ρ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΊΠ°ΡΡΠ° ΡΠΈΠΏΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ
ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Β«addressesΒ»
Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ Address, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅
ΠΏΠΎΠ»Π΅ Β«cityΒ» Π² ΡΡΠΈΡ
Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ
Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ
Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ City:
[
'fieldPaths' => [
'addresses.$' => 'MyProject\Address',
'addresses.$.city' => 'MyProject\City',
],
]
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΡΠΈΡ ΡΡΡΡ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ PHP. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ:
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 ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ
MongoDB\Driver\Cursor::setTypeMap() Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
MongoDB\Driver\Cursor ΠΈΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°
$typeMap
Π² ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
MongoDB\BSON\toPHP(),
MongoDB\BSON\Document::toPHP()
ΠΈ MongoDB\BSON\PackedArray::toPHP(). ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΡΡΡ
ΠΊΠ»Π°ΡΡΠΎΠ² (root, document, ΠΈ
array) ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎ, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
ΠΊ ΡΠΈΠΏΠ°ΠΌ ΠΏΠΎΠ»Π΅ΠΉ.
ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ°ΡΡΠ΅ ΡΠ°Π²Π½ΠΎ NULL, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°.
Π ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ:
Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ
ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ MongoDB\BSON\Unserializable
ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ MongoDB\BSON\Persistable
ΡΠ°ΡΡΠΈΡΡΠ΅Ρ ΠΊΠ»Π°ΡΡ 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")}