Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ², ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΎΡΠΌΠ°ΡΠ° 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 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ:
ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊΠ»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
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-ΠΎΠ±ΡΠ΅ΠΊΡΡ.
ΠΠ»Ρ ΡΠΎΡΡΠ°Π²Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠΈ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ :
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΡΡ
Π³ΡΡΠΏΠΏΠΎΠ²ΡΡ
ΡΠΈΠΏΠΎΠ², ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Ρ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΊΠ°ΡΡΠ° ΡΠΈΠΏΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ
ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Β«addressesΒ»
Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ Address, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅
ΠΏΠΎΠ»Π΅ Β«cityΒ» Π² ΡΡΠΈΡ
Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ
Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ
Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ City:
[
'fieldPaths' => [
'addresses.$' => 'MyProject\Address',
'addresses.$.city' => 'MyProject\City',
],
]
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΡΠΈΡ ΡΡΡΡ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ PHP. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ:
Π‘Π²ΠΎΠΉΡΡΠ²ΠΎ __pclass ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΈ ΠΎΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Binary-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° ΠΏΠΎΠ΄ΡΠΈΠΏ Binary Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ°Π²Π΅Π½ 0x80. ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΡΡΠΈΡ ΡΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ __pclass Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π»ΡΠ±ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ.
ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ PHP-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ stdClass, ΠΏΡΠΈΡΡΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»ΡΡ BSON-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΡΠΊΡΡΡΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° stdClass.Β«array»«objectΒ» ΠΈΠ»ΠΈ Β«stdClass»«bsonΒ»ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅
bsonΠ΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΡΡ ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΡΠΈΠΏΠΎΠ², Π½ΠΎ Π½Π΅ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ 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::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")}