PHPのデバッグ作業などで使われるprint_r()
関数。変数の内容をわかりやすく表示するための関数なのですが、最後の「r」が何を意味するのか考えると夜も眠れないので(三球・照代)、調べてみました。
公式ドキュメントの見解
print_r()
関数の「r」が何を意味するのか知るには、まずPHPの公式ドキュメントを確認するべきでしょう。次のように説明されています。
print_r — 指定した変数に関する情報を解りやすく出力する
print_r(mixed $value, bool $return = false): string|bool
print_r() は、 変数の値に関する情報を解り易い形式で表示します。
https://www.php.net/manual/ja/function.print-r.php
英語版のドキュメントはこうです。
print_r — Prints human-readable information about a variable
print_r(mixed $value, bool $return = false): string|bool
print_r() displays information about a variable in a way that’s readable by humans.
https://www.php.net/manual/en/function.print-r.php
この説明からわかるのは、print_r()
関数が変数に関する情報をわかりやすい形式で表示するということです。関数名の「r」について、その意味や由来は解説されていませんでした。
しかし、鋭いあなたはもうお気付きでしょう。英語版ドキュメントの赤線部分にヒントが隠されているような気がします。
PHPコミュニティの見解
print_r()
関数の「r」が何を意味するのか、PHP公式ドキュメントには明確な説明がないため、PHP開発者やコミュニティメンバーがこの疑問について議論してきました。これまでにコミュニティで議論されてきた説を見ていきましょう。
「r」の略語の候補
1. readable説
最も支持されている説は、「r」は「readable(読みやすい)」の略であるというものです。変数の内容を人間が読みやすい形式で出力するという公式ドキュメントの説明とも合致します。
2. recursive説
もう一つの有力な説は、「r」は「recursive(再帰的)」の略であるというものです。print_r()
関数は、配列やオブジェクトを再帰的に展開して表示します。
3. その他の説
- representation: 「表現」
- read: 「読み取る」
- reference: 「参照」
- reflect: 「反映」
- return: 「返す」
どの説もそれっぽいですね。
私の見解
PHPコミュニティではreadable説が最有力なんですよ。しかし私はあえて異を唱えたい。私はrecursive説を推しています。
readable説は、「human-readable(人間が読める)」の略が「r」だと言っているわけです。では、「human-readable」の対義語は何ですか。「machine-readable(機械が読める)」ですね。print_r()
関数は、machine-readableな情報をhuman-readableに変換して出力するものです。どっちもreadableなのに「r」は「readable」の略ですっておかしいでしょ。
次に、print_r()
の関数名の成り立ちについて考えてみましょう。これはPHPに元々あったprint
の後ろに_r
を付けたと考えてよいでしょう。ということはprint
とprint_r
の違いに「r」の謎を解くヒントがあるのではないでしょうか。
print
は文字列を出力する言語構造です。文字列の入った変数を渡せば、その変数の内容を表示してくれます。
$var = 'こんぬづわ';
print $var;
/*出力
こんぬづわ
*/
ところが、配列の入った変数を渡すとうまく表示できません。
$arr = array('こんにちは', 'こんぬづわ', 'カムスタ');
print $arr;
/*出力
Array
*/
そこでprint_r
の出番となるわけです。
$arr = array('こんにちは', 'こんぬづわ', 'カムスタ');
print_r($arr);
/*出力
Array
(
[0] => こんにちは
[1] => こんぬづわ
[2] => カムスタ
)
*/
つまり、print_r
ならば配列も表示できるよ。多次元配列も再帰的に表示できるよ。というのがprint
との違いです。
というわけで、print_r
の「r」はrecursive説を私は支持します(強引)。
さいごに
ということで、print_r()
の「r」の意味について探ったところ、次のようなことがわかりました。
- 公式見解は存在しない。
- PHPコミュニティでは、readable説が最有力、次点がrecursive説。
- 私はrecursive説推し。
他の可能性として、ダブルミーニング説もあり得ますね。
でわでわ
コメント