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

MongoDB\BSON\ObjectIdInterface

Interface

Interface für Klassen, die eine BSON-ObjectId repräsentieren und entsprechende Methoden zur Verfügung stellen.

seit PHP 1.3.0 Kategorie: db

Signatur

interface ObjectIdInterface

Beschreibung

MongoDB\BSON\ObjectIdInterface definiert den Vertrag für Klassen, die eine BSON-ObjectId kapseln. Eine ObjectId ist ein 12-Byte-Wert, der in MongoDB als Standardprimärschlüssel für Dokumente verwendet wird und Informationen über den Erstellungszeitpunkt, den Host sowie einen inkrementellen Zähler enthält.

Das Interface schreibt die Methode __toString() vor, um die ObjectId als 24-stelligen Hexadezimal-String zurückzugeben, sowie getTimestamp(), um den Unix-Zeitstempel aus der ObjectId zu extrahieren. Damit ermöglicht es eine austauschbare und erweiterbare Implementierung, z. B. für eigene Value-Objects oder Mocking in Tests.

Klassen, die dieses Interface implementieren, können überall dort eingesetzt werden, wo der MongoDB-Treiber eine ObjectId erwartet – etwa beim Schreiben oder Lesen von Dokumenten. Dies fördert Interoperabilität und erleichtert das Dependency-Inversion-Prinzip in der Anwendungsarchitektur.

Die konkrete Standardimplementierung des Treibers ist MongoDB\BSON\ObjectId, die dieses Interface bereits vollständig umsetzt.

Beispiele

Eigene Klasse, die ObjectIdInterface implementiert

<?php
use MongoDB\BSON\ObjectIdInterface;

class CustomObjectId implements ObjectIdInterface
{
    private string $id;

    public function __construct(string $id = '')
    {
        // Einfache Demo: echte Implementierung würde eine valide OID erzeugen
        $this->id = $id ?: bin2hex(random_bytes(12));
    }

    public function getTimestamp(): int
    {
        // Die ersten 4 Bytes (8 Hex-Zeichen) enthalten den Unix-Timestamp
        return (int) hexdec(substr($this->id, 0, 8));
    }

    public function __toString(): string
    {
        return $this->id;
    }
}

$oid = new CustomObjectId();
echo $oid . PHP_EOL;              // z. B. "507f1f77bcf86cd799439011"
echo $oid->getTimestamp() . PHP_EOL; // Unix-Timestamp aus den ersten 4 Bytes
507f1f77bcf86cd799439011 1350842231

Typprüfung gegen ObjectIdInterface statt konkrete Klasse

<?php
use MongoDB\BSON\ObjectId;
use MongoDB\BSON\ObjectIdInterface;

function printObjectIdInfo(ObjectIdInterface $oid): void
{
    echo 'ID       : ' . $oid . PHP_EOL;
    echo 'Timestamp: ' . $oid->getTimestamp() . PHP_EOL;
    echo 'Datum    : ' . date('Y-m-d H:i:s', $oid->getTimestamp()) . PHP_EOL;
}

// Funktioniert mit der Standard-Implementierung des Treibers
$objectId = new ObjectId('507f1f77bcf86cd799439011');
printObjectIdInfo($objectId);
ID : 507f1f77bcf86cd799439011 Timestamp: 1350842231 Datum : 2012-10-22 00:37:11

// Wichtig · Fallstricke

Abhängigkeit: Dieses Interface ist Teil der mongodb-PECL-Extension (ab Version 1.3.0) und steht nicht in der Legacy-mongo-Extension zur Verfügung. Stelle sicher, dass die Extension korrekt installiert ist (ext-mongodb).

Serialisierung: Klassen, die ObjectIdInterface implementieren, müssen zusätzlich MongoDB\BSON\Serializable implementieren, wenn sie direkt in MongoDB-Dokumente serialisiert werden sollen. Ohne korrekte Serialisierung werden eigene Implementierungen nicht als BSON-ObjectId gespeichert.

Typhinweise: Es empfiehlt sich, in Signnaturen immer ObjectIdInterface statt ObjectId zu verwenden, um die Testbarkeit (Mocking) und Austauschbarkeit zu verbessern.