Start · Sprachen · PHP · Referenz · vfprintf

vfprintf

Funktion

Schreibt einen formatierten String in einen Stream und gibt die Anzahl der ausgegebenen Zeichen zurück.

seit PHP 5.0.0 Kategorie: string

Signatur

vfprintf(resource $handle, string $format, array $values): int|false

Beschreibung

vfprintf() funktioniert wie fprintf(), erwartet jedoch die Formatierungsargumente als Array statt als einzelne Parameter. Dies macht die Funktion besonders nützlich, wenn die Argumente bereits in einem Array vorliegen oder dynamisch zusammengestellt werden – z. B. beim Verarbeiten von Datenbankzeilen oder beim Übergeben von Argumenten aus einer variablen Argumentliste.

Der erste Parameter muss ein gültiger Stream-Handle sein, wie er von fopen(), popen() oder einer ähnlichen Funktion zurückgegeben wird. Der Format-String unterstützt dieselben Platzhalter wie printf(): %s für Strings, %d für ganze Zahlen, %f für Fließkommazahlen, %05.2f für formatierte Zahlen mit Breite und Genauigkeit usw.

Die Funktion gibt die Anzahl der geschriebenen Zeichen zurück oder false bei einem Fehler. Im Unterschied zu vprintf(), das auf die Standardausgabe schreibt, erlaubt vfprintf() die gezielte Ausgabe in eine Datei oder einen anderen Stream.

Typische Anwendungsfälle sind das Schreiben von formatierten Log-Dateien, CSV-Exports oder das strukturierte Ausgeben von Daten in beliebige Streams, wenn die Argumente als Array vorliegen.

Parameter

Name Typ Default Beschreibung
$handle Pflicht resource Ein gültiger Stream-Handle, wie er von fopen() oder popen() geöffnet wurde. Der formatierte String wird in diesen Stream geschrieben.
$format Pflicht string Der Format-String mit Platzhaltern wie %s, %d, %f usw. Die Syntax ist identisch mit der von sprintf() bzw. printf().
$values Pflicht array Ein Array mit den Werten, die in den Format-String eingesetzt werden. Die Array-Elemente werden in der Reihenfolge den Platzhaltern zugeordnet.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der in den Stream geschriebenen Zeichen als int zurück. Bei einem Fehler wird false zurückgegeben.

Beispiele

Formatierte Zeile in eine Log-Datei schreiben

<?php
$logFile = fopen('/tmp/app.log', 'a');

if ($logFile === false) {
    die('Log-Datei konnte nicht geöffnet werden.');
}

$logData = ['2024-01-15 10:23:45', 'ERROR', 'Datenbankverbindung fehlgeschlagen'];
$bytesWritten = vfprintf($logFile, "[%s] [%s] %s\n", $logData);

echo "Geschriebene Bytes: " . $bytesWritten . PHP_EOL;

fclose($logFile);
Geschriebene Bytes: 55

CSV-Export mit formatierten Zahlen

<?php
$csvFile = fopen('/tmp/export.csv', 'w');

if ($csvFile === false) {
    die('CSV-Datei konnte nicht erstellt werden.');
}

// Kopfzeile
fwrite($csvFile, "Produkt,Preis,Menge\n");

// Produktdaten als Array
$products = [
    ['Apfel',  0.49, 150],
    ['Banane', 0.29,  80],
    ['Orange', 0.89,  60],
];

foreach ($products as $row) {
    vfprintf($csvFile, "%s;%.2f;%d\n", $row);
}

fclose($csvFile);
echo file_get_contents('/tmp/export.csv');
Produkt,Preis,Menge Apfel;0.49;150 Banane;0.29;80 Orange;0.89;60

Argumente aus einer variablen Argumentliste weitergeben

<?php
function logMessage(string $format, mixed ...$args): void {
    $stream = fopen('php://stderr', 'w');
    vfprintf($stream, $format . PHP_EOL, $args);
    fclose($stream);
}

logMessage('Benutzer %s hat sich um %s Uhr angemeldet.', 'admin', '09:15');
Benutzer admin hat sich um 09:15 Uhr angemeldet.

// Wichtig · Fallstricke

Sicherheitshinweis: Der $format-String sollte niemals direkt aus Benutzereingaben stammen, da ein manipulierter Format-String zu unerwartetem Verhalten oder dem Offenlegen von Speicherinhalten führen kann. Stets einen fest kodierten Format-String verwenden und Benutzerdaten ausschließlich als Elemente des $values-Arrays übergeben.

Die Funktion ist der Array-Pendant zu fprintf(). Wenn Argumente bereits als Array vorliegen, ist vfprintf() die idiomatische Wahl. Für die Ausgabe auf STDOUT steht vprintf() bereit; wenn der formatierte String nur als Rückgabewert benötigt wird, ist vsprintf() die richtige Alternative.

Das Handle muss mit Schreibberechtigung ('w', 'a', 'r+' usw.) geöffnet worden sein, da sonst false zurückgegeben wird.