Signatur
Beschreibung
Die Klasse IMAP\Connection repräsentiert eine aktive Verbindung zu einem IMAP-, POP3- oder NNTP-Server und löst den früheren Ressourcentyp imap ab, der bis PHP 8.0 von Funktionen wie imap_open() zurückgegeben wurde. Sie ist vollständig opak, das heißt, ihre interne Struktur ist nicht von außen zugänglich und sie bietet keine öffentlichen Eigenschaften oder Methoden.
Alle IMAP-Erweiterungsfunktionen, die früher eine resource vom Typ imap als Parameter akzeptierten (z. B. imap_fetch_overview(), imap_search(), imap_close()), erwarten nun ein Objekt vom Typ IMAP\Connection. Der Rückgabewert von imap_open() ist entsprechend von resource|false auf IMAP\Connection|false geändert worden.
Da die Klasse opak ist, kann sie nicht manuell instanziiert werden. Eine Instanz erhält man ausschließlich durch den Rückgabewert von imap_open() oder imap_reopen(). Der Typ lässt sich mit instanceof IMAP\Connection oder get_class() prüfen.
Beim Migrieren von bestehendem Code reicht es in der Regel aus, Typprüfungen von is_resource() auf instanceof IMAP\Connection umzustellen, da die IMAP-Funktionen selbst unverändert bleiben und das neue Objekt transparent akzeptieren.
Beispiele
Verbindung öffnen und Typ prüfen
<?php
// Verbindung zum IMAP-Server herstellen
$connection = imap_open(
'{imap.example.com:993/imap/ssl}INBOX',
'benutzer@example.com',
'geheimes_passwort'
);
if ($connection instanceof IMAP\Connection) {
echo "Verbindung erfolgreich hergestellt." . PHP_EOL;
// Anzahl der Nachrichten im Postfach abrufen
$anzahl = imap_num_msg($connection);
echo "Nachrichten im Postfach: " . $anzahl . PHP_EOL;
// Verbindung sauber schließen
imap_close($connection);
} else {
echo "Verbindung fehlgeschlagen: " . imap_last_error() . PHP_EOL;
}
Migration von is_resource() auf instanceof
<?php
// PHP 8.0 und älter (veraltet):
// $connection = imap_open(...);
// if (is_resource($connection)) { ... }
// Ab PHP 8.1 – korrekte Prüfung:
$connection = imap_open(
'{imap.example.com:993/imap/ssl}INBOX',
'benutzer@example.com',
'geheimes_passwort'
);
if (!($connection instanceof IMAP\Connection)) {
throw new RuntimeException('IMAP-Verbindung konnte nicht geöffnet werden.');
}
// Ungelesene Nachrichten suchen
$ungelesen = imap_search($connection, 'UNSEEN');
if ($ungelesen !== false) {
echo "Ungelesene Nachrichten: " . count($ungelesen) . PHP_EOL;
foreach ($ungelesen as $msgNr) {
$header = imap_headerinfo($connection, $msgNr);
echo ' - ' . $header->subject . PHP_EOL;
}
}
imap_close($connection);
// Wichtig · Fallstricke
Rückwärtskompatibilität: Code, der is_resource() zur Prüfung einer IMAP-Verbindung verwendet, liefert ab PHP 8.1 false, da IMAP\Connection ein Objekt ist. Entsprechende Prüfungen müssen auf instanceof IMAP\Connection umgestellt werden.
Manuelle Instanziierung nicht möglich: Es gibt keinen öffentlichen Konstruktor. Der Versuch, new IMAP\Connection() aufzurufen, führt zu einem Fehler. Instanzen werden ausschließlich von imap_open() erzeugt.
Erweiterung erforderlich: Die IMAP-Erweiterung ist nicht in jeder PHP-Distribution standardmäßig aktiviert. Sie muss mit --with-imap kompiliert oder als Modul geladen werden.