Signatur
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
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);
// 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.