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