Start · Sprachen · PHP · Referenz · MongoDB\BSON\Decimal128Interface

MongoDB\BSON\Decimal128Interface

Interface

Interface für Klassen, die eine BSON-Decimal128-Zahl repräsentieren und deren Serialisierung in MongoDB-Dokumente ermöglichen.

seit PHP 1.5.0 Kategorie: db

Signatur

interface Decimal128Interface

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";
}
19.99 Ist ein gültiger BSON Decimal128-Wert.

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
1.234.567,89

// 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.