Зачувување податоци
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Зачувување податоци
Референца за `mongodb.persistence.php` со подобрена типографија и навигација.
Серијализација и десеријализација на PHP променливи во MongoDB
Овој документ дискутира како сложени структури (т.е. документи, низи и објекти) се претвораат помеѓу BSON и PHP вредности.
Серијализација во BSON
Низи
Ако низата е спакувана низа — т.е. празна низа или клучевите почнуваат од 0 и се последователни без празнини: BSON низа.
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 објект
Документ на највисоко ниво (корен), always се серијализира како 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 }
Забележете дека петте примери се extracts на целосен документ, и претставуваат само one вредност во рамките на документ.
Објекти
Ако објект е од 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 and private properties.
Ако објект е од класа што го имплементира MongoDB\BSON\Serializable интерфејс, повикај ако PHP вредноста не може да се претвори во BSON. Можни причини вклучуваат, но не се ограничени на, наидување на неочекувано и користи го вратениот массив или stdClass за серијализација како BSON документ или массив. BSON типот ќе се определи со следново:
-
Коренските документи мора да се серијализираат како BSON документ.
-
MongoDB\BSON\Persistable објекти мора да се серијализираат како BSON документ.
-
Враќа ако PHP вредноста не може да се претвори во BSON. Можни причини вклучуваат, но не се ограничени на, наидување на неочекувано враќа спакуван массив, серијализирај како BSON массив.
-
Враќа ако PHP вредноста не може да се претвори во BSON. Можни причини вклучуваат, но не се ограничени на, наидување на неочекувано враќа неспакуван массив или stdClass, серијализирај како BSON документ.
-
Враќа ако PHP вредноста не може да се претвори во BSON. Можни причини вклучуваат, но не се ограничени на, наидување на неочекувано не врати массив или stdClass, фрли MongoDB\Driver\Exception\UnexpectedValueException exception.
Ако објект е од класа што го имплементира
MongoDB\BSON\Persistable интерфејс (што подразбира MongoDB\BSON\Serializable), добијте ги својствата на сличен начин како во претходните параграфи, но
also "), добијте ги својствата на сличен начин како во претходните параграфи, но
__pclass додадете дополнително својство
0x80 како бинарна вредност, со подтип
На __pclass и податоци што ги носат целосно квалификуваното име на класата на објектот што се серијализира. ако PHP вредноста не може да се претвори во BSON. Можни причини вклучуваат, но не се ограничени на, наидување на неочекуваносвојството се додава во низата или објектот вратен од __pclass , што значи дека ќе презапише било кој ако PHP вредноста не може да се претвори во BSON. Можни причини вклучуваат, но не се ограничени на, наидување на неочекувано клуч/својство во __pclass вратена вредност. Ако сакате да го избегнете ова однесување и да поставите своја not implement MongoDB\BSON\Persistable вредност, мора MongoDB\BSON\Serializable directly.
Примери
<?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';
public function bsonSerialize(): array
{
return ['foo' => $this->foo, 'prot' => $this->prot];
}
} // => {"foo": 42, "prot": "wine"}
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"}
/**
* Nesting Serializable classes
*/
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 = 'wine';
private $fpr = 'cheese';
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": "wine", "__pclass": {"$type": "80", "$binary": "VXBwZXJDbGFzcw=="}}
?>и наместо тоа треба да имплементирате
Конфигурација на мапата на типови
Десеријализација од BSON mongo Наследената
{"0": "foo"} and ["foo"]екстензија ги десеријализираше и BSON документите и низите како PHP низи. Додека PHP низите се погодни за работа, ова однесување беше проблематично бидејќи различни BSON типови може да се десеријализираат во иста PHP вредност (на пр.
mongodb ) и го прават невозможно да се заклучи оригиналниот BSON тип. Стандардно,
екстензијата го решава овој проблем со осигурување дека BSON низите и документите се претвораат во PHP низи и објекти, соодветно.
- root
-
За сложени типови, постојат три типа на податоци: only
- document
-
се однесува на највисокото ниво BSON документ only
- array
-
се однесува на вградени BSON документи
се однесува на BSON низа "addresses" низа до Адреса class and each
"city" поле во тие вградени документи за адреса до Град класа:
[
'fieldPaths' => [
'addresses.$' => 'MyProject\Address',
'addresses.$.city' => 'MyProject\City',
],
]
Секој од овие три типа на податоци, како и специфичните мапирања на полињата, може да се мапираат на различни PHP типови. Можните вредности за мапирање се:
- не е поставено or NULL (стандардно)
-
-
BSON низа ќе се десериализира како PHP array.
-
BSON документ (корен или вграден) без __pclass property [1] станува PHP stdClass објект, со секој клуч на BSON документот поставен како јавен stdClass property.
-
BSON документ (корен или вграден) со __pclass property [1] станува PHP објект со името на класата како што е дефинирано од __pclass property.
Ако именуваната класа го имплементира MongoDB\BSON\Persistable интерфејс, тогаш својствата на BSON документот, вклучувајќи го и __pclass својство, се испраќаат како асоцијативна низа до Својства во рамките на BSON низата или документот. функција за иницијализирање на својствата на објектот.
Ако именуваната класа не постои или не го имплементира MongoDB\BSON\Persistable интерфејс, stdClass ќе се користи и секој клуч на BSON документот (вклучувајќи го и __pclassќе биде поставен како јавен stdClass property.
На __pclass функционалноста се потпира на тоа својството да биде дел од преземениот MongoDB документ. Ако користите projection при пребарување за документи, треба да го вклучите __pclass поле во проекцијата за оваа функционалност да работи.
-
"array"-
Претвора BSON низа или BSON документ во PHP низа. Нема да има посебен третман на __pclass property [1], но може да биде поставен како елемент во вратената низа ако бил присутен во BSON документот.
"object"or"stdClass"-
Претвора BSON низа или BSON документ во stdClass објект. Нема да има посебен третман на __pclass property [1], но може да биде поставен како јавен параметар во вратениот објект ако бил присутен во BSON документот.
"bson"-
Претвора BSON низа во MongoDB\BSON\PackedArray и BSON документ во MongoDB\BSON\Document, без оглед на тоа дали BSON документот има __pclass property [1].
Забелешка: На
bsonвредноста е достапна само за трите основни типови, не во специфичните мапирања на полињата. - која било друга низа
-
Го дефинира името на класата во која треба да се десеријализира BSON низата или BSON објектот. За BSON објекти што вклучуваат __pclass својства, таа класа ќе има приоритет.
Ако именуваната класа не постои, не е конкретна (т.е. е апстрактна или интерфејс), или не имплементира MongoDB\BSON\Unserializable тогаш MongoDB\Driver\Exception\InvalidArgumentException Пример со невалиден делител
Ако BSON објектот има __pclass својство и таа класа постои и имплементира MongoDB\BSON\Persistable ќе ја надвладее класата обезбедена во мапата на типови.
ќе го надмине класот обезбеден во мапата на типови. including the __pclass Својствата на BSON документот, Својства во рамките на BSON низата или документот. функција за иницијализирање на својствата на објектот.
TypeMaps
својство ако постои, ќе бидат испратени како асоцијативна низа до
ТипМапите може да се постават преку MongoDB\Driver\Cursor::setTypeMap()
MongoDB\Driver\Cursor метод на
$typeMap аргументот на
се фрла ако влезот содржи неподдржан, застарен BSON тип. Претходно, таквите типови беа игнорирани.,
Враќа PHP претстава на BSON вредностПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
објект, илиMongoDB\BSON\PackedArray::toPHP()root, documentПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
array. Секоја од трите класи (
) може индивидуално да се постави, покрај типовите специфични за полето. NULLАко вредноста во мапата е default , тоа значи исто како
Примери
вредност за таа ставка.
- MyClass
-
што прави not Овие примери користат следниве класи:
- YourClass
-
имплементира кој било интерфејс MongoDB\BSON\Unserializable
- OurClass
-
имплементира кој било интерфејс MongoDB\BSON\Persistable
- TheirClass
-
што имплементира
На Својства во рамките на BSON низата или документот.
што се протега OurClass also поставува $unserialized својство на true:
<?php
function bsonUnserialize( array $map )
{
foreach ( $map as $k => $value )
{
$this->$k = $value;
}
$this->unserialized = true;
}
/* typemap: [] (all defaults) */
{ "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") }