Signatur
Beschreibung
PharException erbt von RuntimeException und wird von der Phar-Erweiterung geworfen, wenn während der Arbeit mit Phar-Archiven ein Fehler auftritt – z. B. beim Erstellen, Öffnen, Lesen oder Modifizieren von .phar-Dateien.
Da PharException eine eigene Klasse ist, lässt sie sich gezielt in einem catch-Block abfangen, ohne andere RuntimeException-Fehler zu behandeln. Das erlaubt saubere Fehlerbehandlung in Anwendungen, die Phar-Archive erzeugen oder ausliefern.
Typische Auslöser sind fehlende Schreibrechte (phar.readonly in der php.ini ist aktiv), ungültige Archiv-Signaturen, beschädigte Archive oder der Versuch, ein nicht existierendes Phar zu öffnen.
Eigene Unterklassen von PharException können erstellt werden, um anwendungsspezifische Phar-Fehler zu modellieren, obwohl dies in der Praxis selten notwendig ist.
Beispiele
PharException beim Öffnen eines ungültigen Archivs abfangen
<?php
try {
// Versucht, eine nicht existierende oder ungültige Phar-Datei zu öffnen
$phar = new Phar('/pfad/zu/ungueltig.phar');
} catch (PharException $e) {
echo 'Phar-Fehler: ' . $e->getMessage() . PHP_EOL;
echo 'Code: ' . $e->getCode() . PHP_EOL;
} catch (RuntimeException $e) {
echo 'Allgemeiner Laufzeitfehler: ' . $e->getMessage() . PHP_EOL;
}
PharException beim Erstellen eines Archivs behandeln
<?php
// phar.readonly muss in der php.ini auf 0 gesetzt sein
try {
$phar = new Phar('/tmp/meinarchiv.phar');
$phar->startBuffering();
$phar->addFromString('index.php', '<?php echo "Hallo Welt";');
$phar->setStub($phar->createDefaultStub('index.php'));
$phar->stopBuffering();
echo 'Phar erfolgreich erstellt.' . PHP_EOL;
} catch (PharException $e) {
echo 'Fehler beim Erstellen des Phar-Archivs: ' . $e->getMessage() . PHP_EOL;
// Aufräumen, Logging, Benachrichtigung etc.
}
Eigene Unterklasse von PharException
<?php
class MeinPharException extends PharException
{
public function __construct(string $archivPfad, string $grund)
{
parent::__construct(
sprintf('Phar-Archiv "%s" konnte nicht verarbeitet werden: %s', $archivPfad, $grund)
);
}
}
function ladePhar(string $pfad): Phar
{
if (!file_exists($pfad)) {
throw new MeinPharException($pfad, 'Datei nicht gefunden');
}
try {
return new Phar($pfad);
} catch (PharException $e) {
throw new MeinPharException($pfad, $e->getMessage());
}
}
try {
$phar = ladePhar('/tmp/existiert_nicht.phar');
} catch (MeinPharException $e) {
echo $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Achtung: Standardmäßig ist in vielen PHP-Installationen die INI-Einstellung phar.readonly = 1 aktiv. Das Erstellen oder Modifizieren von Phar-Archiven löst dann eine PharException aus. Diese Einstellung muss explizit in der php.ini oder per -d phar.readonly=0 deaktiviert werden.
Da PharException von RuntimeException erbt, wird sie auch von einem catch (RuntimeException $e)-Block abgefangen. Um Phar-spezifische Fehler gesondert zu behandeln, sollte PharException stets vor einem allgemeineren catch-Block platziert werden.
Die Phar-Erweiterung kann je nach Operation sowohl PharException als auch BadMethodCallException oder UnexpectedValueException werfen. Ein vollständiges Error-Handling sollte daher ggf. mehrere Catch-Blöcke vorsehen.