Signatur
Beschreibung
Das Interface MongoDB\BSON\Decimal128Interface definiert den Vertrag für Klassen, die eine BSON-Decimal128-Zahl kapseln. Der BSON-Typ Decimal128 entspricht dem IEEE-754-Standard für dezimale Gleitkommazahlen mit 128-Bit-Genauigkeit und wird in MongoDB verwendet, um Geldbeträge oder wissenschaftliche Werte ohne die typischen Rundungsfehler binärer Gleitkommatypen zu speichern.
Klassen, die dieses Interface implementieren, müssen die Methode __toString() bereitstellen, die die dezimale Zeichenkettendarstellung der Zahl zurückgibt. Dies erlaubt eine konsistente Serialisierung und Deserialisierung von Decimal128-Werten innerhalb der MongoDB-PHP-Bibliothek.
Das Interface ist besonders nützlich, wenn eigene Wertklassen (Value Objects) für Geldbeträge oder andere präzise Dezimalzahlen erstellt werden sollen, die nahtlos in BSON-Dokumente eingebettet werden können. Die Standardimplementierung MongoDB\BSON\Decimal128 implementiert dieses Interface bereits.
Durch die Trennung von Interface und Implementierung können Anwendungen eigene Decimal128-Wertklassen erstellen, die sowohl domänenspezifische Logik als auch die BSON-Kompatibilität vereinen, ohne direkt von der konkreten Klasse MongoDB\BSON\Decimal128 abhängen zu müssen.
Beispiele
Eigene Decimal128-Wertklasse implementieren
<?php
use MongoDB\BSON\Decimal128Interface;
use MongoDB\BSON\Serializable;
class Geldwert implements Decimal128Interface
{
private string $wert;
public function __construct(string $wert)
{
// Sicherstellen, dass der Wert eine gültige Dezimalzahl ist
if (!is_numeric($wert)) {
throw new \InvalidArgumentException("Ungültiger Dezimalwert: $wert");
}
$this->wert = $wert;
}
public function __toString(): string
{
return $this->wert;
}
public function getWert(): string
{
return $this->wert;
}
}
$preis = new Geldwert('19.99');
echo (string) $preis; // 19.99
// Prüfen ob Objekt das Interface implementiert
if ($preis instanceof Decimal128Interface) {
echo "Ist ein gültiger BSON Decimal128-Wert.\n";
}
Verwendung von Decimal128Interface in Typprüfungen
<?php
use MongoDB\BSON\Decimal128;
use MongoDB\BSON\Decimal128Interface;
function formatiereBetrag(Decimal128Interface $betrag): string
{
return number_format((float)(string)$betrag, 2, ',', '.');
}
$native = new Decimal128('1234567.89');
echo formatiereBetrag($native) . "\n"; // 1.234.567,89
// Akzeptiert jede Klasse, die Decimal128Interface implementiert
// – auch eigene Value-Objects aus dem vorherigen Beispiel
// Wichtig · Fallstricke
Präzision: Decimal128 bietet 34 signifikante Dezimalstellen. Werden Werte intern als PHP-float zwischengespeichert, gehen Präzision und damit der Vorteil von Decimal128 verloren. Immer mit Zeichenketten (string) arbeiten.
Verfügbarkeit: Das Interface ist Bestandteil der PECL-Erweiterung mongodb ab Version 1.5.0. Es ist nicht Teil der übergeordneten Bibliothek mongodb/mongodb (Composer), sondern der C-Extension.
Serialisierung: Damit eigene Implementierungen korrekt in BSON serialisiert werden, sollte die Klasse zusätzlich MongoDB\BSON\Serializable implementieren oder der MongoDB-Treiber muss das Interface erkennen – prüfe die Dokumentation der verwendeten Treiberversion.