Signatur
Beschreibung
Die Klasse Dba\Connection wurde in PHP 8.4 eingeführt und stellt eine objektorientierte Schnittstelle zur DBA-Erweiterung (Database Abstraction Layer) bereit. Sie repräsentiert eine aktive Verbindung zu einer dateibasierten Datenbank, die über Handler wie gdbm, ndbm, db4, lmdb oder cdb verwaltet wird.
Vor PHP 8.4 wurden DBA-Verbindungen als einfache Ressourcen (resource) zurückgegeben und mussten an jede DBA-Funktion übergeben werden. Mit Dba\Connection wird dies durch ein echtes Objekt ersetzt, das denselben Zweck erfüllt, aber besser in modernen PHP-Code integriert werden kann — etwa mit finally-Blöcken, Dependency Injection oder Type-Hints.
Objekte dieser Klasse werden typischerweise nicht direkt instanziiert, sondern über die Funktion dba_open() oder dba_popen() erzeugt. Sie können dann an alle dba_*-Funktionen übergeben werden, die bisher eine Ressource erwarteten.
Die Klasse kann nicht manuell instanziiert werden (new Dba\Connection() ist nicht möglich). Sie implementiert kein Interface und kann nicht erweitert werden — sie dient ausschließlich als typisiertes Handle für eine bestehende DBA-Verbindung.
Beispiele
DBA-Datenbank öffnen, Wert schreiben und lesen
<?php
// Datenbank öffnen (Handler 'db4' oder 'gdbm' je nach Installation)
$db = dba_open('/tmp/meine_datenbank', 'c', 'db4');
if (!($db instanceof Dba\Connection)) {
throw new RuntimeException('Datenbankverbindung konnte nicht geöffnet werden.');
}
// Schlüssel-Wert-Paar speichern
dba_insert('benutzername', 'alice', $db);
// Wert abrufen
$wert = dba_fetch('benutzername', $db);
echo $wert; // alice
// Verbindung schließen
dba_close($db);
Verwendung mit try/finally für sicheres Schließen
<?php
$db = dba_open('/tmp/konfiguration', 'c', 'gdbm');
if (!($db instanceof Dba\Connection)) {
throw new RuntimeException('DBA-Verbindung fehlgeschlagen.');
}
try {
dba_insert('version', '1.0.0', $db);
dba_insert('autor', 'Max Mustermann', $db);
// Alle Schlüssel iterieren
$schluessel = dba_firstkey($db);
while ($schluessel !== false) {
echo $schluessel . ' => ' . dba_fetch($schluessel, $db) . PHP_EOL;
$schluessel = dba_nextkey($db);
}
} finally {
// Verbindung wird immer geschlossen, auch bei Ausnahmen
dba_close($db);
}
// Wichtig · Fallstricke
Hinweis zur Instanziierung: Dba\Connection-Objekte können nicht mit new erzeugt werden. Sie entstehen ausschließlich als Rückgabewert von dba_open() oder dba_popen().
Kompatibilität: Alle dba_*-Funktionen, die bisher eine resource erwarteten, akzeptieren seit PHP 8.4 ein Dba\Connection-Objekt. Älterer Code, der den Rückgabetyp als resource prüft (is_resource()), muss auf instanceof Dba\Connection umgestellt werden.
Persistente Verbindungen: dba_popen() gibt ebenfalls ein Dba\Connection-Objekt zurück, dessen Verbindung zwischen Anfragen wiederverwendet wird (analog zu pconnect bei anderen Datenbanken). Hier ist Vorsicht geboten, da Sperrzustände und nicht geschlossene Transaktionen über Requests hinweg bestehen bleiben können.
Dateisystemsicherheit: Da DBA-Datenbanken auf Dateien basieren, sind Dateipfade sorgfältig zu validieren. Niemals Benutzereingaben ungeprüft als Datenbankpfad verwenden, um Path-Traversal-Angriffe zu vermeiden.