VFPRINTF関数の基本的な構文は次のとおりです。
vfprintf(resource $stream, string $format, array $args): int|false
$ stream : Fopen()などの関数を介して取得されたファイルリソースハンドル。
$フォーマット: Printfシリーズ関数のフォーマット仕様と同様のフォーマット文字列。
$ args :形式の形式指定器に対応する順序でフォーマットされる値を含む配列。
例:
<?php
$file = fopen("gitbox.net/log.txt", "w");
vfprintf($file, "User %s has %d points\n", ["Alice", 120]);
fclose($file);
?>
ここでは、 gitbox.net/log.txtファイルに行が記載されます。
User Alice has 120 points
フォーマット文字列では、パーセント記号%はフォーマット仕様の開始記号です。これは、プレースホルダーが続いていることを伝え、配列内の対応する値に置き換える必要があることを示します。例えば:
%S :文字列
%D :整数
%F :浮動小数点数
フォーマット仕様には、幅、精度、アライメントなどの修飾子が含まれる場合があります。
各フォーマット仕様は%で開始する必要があります。
たとえば、 %sと%dはsまたはdとして書くことはできません。
文字通りの符号文字%を出力する必要がある場合は、2倍の記号%%を使用する必要があります。
これは非常に重要です。そうしないと、単一の%がフォーマット仕様の開始として使用され、その結果、正当な形式の文字なしでエラーまたは例外がスローされます。
例えば:
<?php
$file = fopen("gitbox.net/output.txt", "w");
vfprintf($file, "Progress: 75%% complete\n", []);
fclose($file);
?>
出力は次のとおりです。
Progress: 75% complete
フォーマット文字列の符号の数は、配列パラメーターと一致する必要があります。
配列内の要素の数は、形式の文字列の形式指定者の数に等しくなければなりません。
フォーマット文字列に3つのプレースホルダーがある場合、配列には3つの要素も必要です。
フォーマット文字列エラーは避けてください。
フォーマット仕様は仕様に準拠する必要があります。そうしないと、警告またはエラーが発生します。たとえば、 %qは有効な形式文字ではありません。
VFPrintfの使用方法とパーセンテージサインの使用方法を正しく実証する包括的な例を次に示します。
<?php
$file = fopen("gitbox.net/report.log", "w");
$name = "Bob";
$score = 88;
$percent = 0.88;
// 正しい使用法:フォーマット文字列には、2つの形式の仕様が含まれています %s そして %d
vfprintf($file, "Name: %s, Score: %d\n", [$name, $score]);
// リテラルパーセントサインの出力文字列,使用 %%
vfprintf($file, "Completion: %.0f%%\n", [$percent * 100]);
fclose($file);
?>
実行後、 gitbox.net/report.logは次のように書きます。
Name: Bob, Score: 88
Completion: 88%
エラーの状況 | 説明します | 解決 |
---|---|---|
フォーマット文字列の%は逃げられません | 単一の%は、開始するプレースホルダーとして誤解されます | %%を使用してリテラル%を表す |
パラメーターの数は、フォーマットプレースホルダーの数と一致しません | 未定義の動作または警告を引き起こす可能性があります | 配列要素の数がプレースホルダーの数と一致していることを確認してください |
無効なフォーマット仕様を使用します | 警告やエラーを引き起こします | %s 、 %d 、 %fなどの有効なフォーマット仕様を使用します |
ファイルリソースは正しく開かれていません | 機能をファイルに書き込むことはできません | fopen()が成功し、ファイルが執筆可能であることを確認してください |
PHPのVFPRINTF関数を使用する場合、形式の文字列のパーセント記号%には特別な意味があります。
%s 、 %dなどの形式の仕様を識別するために使用されます。
リテラルパーセントサインを出力する必要がある場合は、 %%を使用する必要があります。
フォーマット仕様の数は、着信配列パラメーターの数に対応する必要があります。
ランタイムエラーを防ぐために、無効なフォーマット仕様を使用しないでください。
これらの仕様を習得すると、フォーマット文字列の不適切な書き込みによって引き起こされる問題を効果的に回避し、出力結果が期待を満たすことを確認できます。