
どうもタスです。
printf関数については別の記事で機能説明をしましたが、文字列をフォーマットする関数には「sprintf」「vprintf」関数も存在します。
これらもprintfと同様のフォーマットが適用できるのですが、ではなぜ3つも関数が用意されいるのかについて今回はお話ししたいと思います。
概要説明
printf:フォーマット済みの文字列を出力する
sprintf:フォーマットされた文字列を返す
vprintf:フォーマットされた文字列を出力する
構文説明
1 |
printf (string $format [, mixed $srgs [, mixed $...]]) : int |
〈引数〉string $format:フォーマット文字列
〈返り値〉出力した文字列の長さ
1 |
sprintf (string $format [, mixed $srgs [, mixed $...]]) : string |
〈引数〉string $format:フォーマット文字列
〈返り値〉フォーマットされた文字列。失敗時にはFALSEを返す。
1 |
vprintf (string $format , array $args) : int |
〈引数〉string $format:フォーマット文字列
〈返り値〉出力した文字列の長さ
詳細説明
以下に、3つの関数の類似点と相違点についてお話しします。
類似点
3つの関数全てに類似する機能は、文字列をフォーマットするということです。
これは、printfの説明に記載したように、意図する形式に引数を変換します。
相違点
相違点には以下の三つが挙げられます。
- フォーマット後の文字列の扱い
- 引数の型
- 返り値
一つ目はフォーマット後の文字列の扱いですが、フォーマットすることは全ての関数で一緒でもフォーマット後の文字列の扱いに相違があります。
フォーマット後、printf及びvprintfは文字列を出力しますが、sprintfは出力せずに返します。
よって、フォーマットしたいだけで出力しない場合はsprintfを使用する方が良いでしょう。
二つ目は引数の型に違いがある点ですが、これは構文説明のとおり、printf及びsprintfは文字列をカンマ区切りで複数指定可能ですが、vprintfは配列で文字列を受け取ります。
よって、全ての関数で複数の引数を指定可能ですが、型が異なる点に注意が必要です。
三つ目は返り値に違いがある点ですが、これも構文説明のとおり、printf及びvprintfは出力した文字列の長さを返すのに対して、sprintfは相違点の一つ目で話したとおり、フォーマット済み文字列を返します。
それらをまとめると以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php // 一点目:フォーマット後の文字列の扱い printf("printf:[%s]<br>", 'abcde'); sprintf("sprintf:[%s]<br>", 'abcde'); // sprintfは文字列の出力を行わない vprintf("vprintf:[%s]<br>", array('fghij')); echo sprintf("sprintf:[%s]<br>", 'klmno'); // 文字列出力処理で別途出力する必要がある echo '<br>'; // 二点目:引数の型 printf("printfの型:[%s]<br>", '文字列です。'); echo sprintf("sprintfの型:[%s]<br>", '文字列です。'); vprintf("vprintfの型:[%s]<br>", array('配列です。')); echo '<br>'; // 三点目:返り値 $ret_p = printf("printfの戻り値:[%s]<br>", '出力した文字列の長さです。'); $ret_s = sprintf("sprintfの戻り値:[%s]", 'フォーマット済みの文字列です。'); $ret_v = vprintf("vprintfの戻り値:[%s]<br>", '出力した文字列の長さです。'); echo $ret_p, '<br>', $ret_s, '<br>', $ret_v, '<br>'; |
出力例
printf:[abcde]
vprintf:[fghij]
sprintf:[klmno]
printfの型:[文字列です。]
sprintfの型:[文字列です。]
vprintfの型:[配列です。]
printfの戻り値:[出力した文字列の長さです。]
vprintfの戻り値:[出力した文字列の長さです。]
64
sprintfの戻り値:[フォーマット済みの文字列です。]
65
なお、同様の関数として「vsprintf」もあります。
これは綴りどおり、vprintfとsprintfを合わせたような関数です。