PHP の echo と print のちがいと使いどころ
PHP には echo
と print
という 2 つのよく似た出力用機能が備わっています。
これらのちがいやそれぞれの使いどころについて、ことあるごとに調べては忘れ調べては忘れの繰り返しなので、備忘録として書き留めておきます。
早速結論ですが、ひとことでいうと、 echo
と print
の最も大きなちがいは式( expression )かどうか です。
PHP の仕様として「 echo
は式ではなくて、 print
は式である 」ということになっているそうです。
つまり
echo
は文( statement )。他の式や文の一部として使うことができない。戻り値を持たない。print
は式( expression )。他の式や文の一部として使うことができる。戻り値を持っていて、それはいつも 1 。
とのこと。
文と式の区別でいうと、たとえば、わかりやすい例は if
文です。
echo
を if
文の中に入れることはできませんが print
の場合は可能です。
// echo の場合: ×
// Parse error になる
if (echo 5) {
print 'echo is an expression with return value';
}
// print の場合: ○
// 問題なく動作する
if (print 5) {
print 'print is an expression with return value';
}
print
の方は式なので、 if
文にかぎらず他の式の中に組み込むことができます。
// ◯ print は他の式や文の要素として利用できる
$result = 10 + (print 3) + (print FALSE);
print $result; // => 12
// × エラー Parse error
$result = (echo 3);
(これらはあくまでも実行の可否を示すための例であり、実用性はありません)
ちなみに、 print
の戻り値は必ず 1 になることに注意が必要です。
例えば、 print FALSE
とした場合でもその戻り値は 1 になります。
このあたりは Ruby の p
や puts
のようなふるまいを期待すると裏切られます。
となると echo
には特段メリットが無いようにも思えますが、 echo
にできて print
にはできないことがあります。
それは「複数の引数を受け取ること」です。
echo
は複数の引数を受け取ることができますが print
は単一の引数しか受け取れません。
// echo の場合: ○
// 問題なく動作します
echo 3, 4, 5; // => 345
// print の場合: ×
// Parse error になる
print 3, 4, 5;
ちなみに、細かい挙動として、 echo $a, $b, $c
の出力は echo $a . $b . $c
と同じように見えますが、引数を連結してから出力しているのではなく echo $a; echo $b; echo $c;
と 3 度呼び出しているのと同等の意味合いになるようです。
このあたりについてはすでに多くの場所で説明がされていますが、個人的にわかりやすいと思うのは Stack Overflow の次のページです。 興味のある方はご覧になってみてください。
- Reference: Comparing PHP's print and echo - Stack Overflow
- How are echo and print different in PHP? - Stack Overflow
ちなみに、共通点として、 echo
も print
も見た目上は関数のように見えますが、いずれも関数ではないとのこと。
また、変数表示の短縮形である <?=
は内部的には echo
として扱われているとのことです。
最後に、パフォーマンス面でのちがいとして「 echo
の方が戻り値を持たない分 print
よりも高速だ」と言われたりしていますが、ここは気にしても仕方がないくらいのわずかなちがいのようです。
まとめます。
echo
とprint
のちがいは「式かどうか」。echo
は式ではなくprint
は式である。echo
は複数の引数を受け取ることができる。print
は引数ひとつだけ。echo
もprint
も関数ではなく言語構成( language structure )である。echo
の方がちょっとだけ高速だけど実用上気にするほどの差はない。
ちなみに、 PHP では echo
と print
の他にも、 exit()
と die()
、 implode()
と join()
など実用上大差のない機能が複数用意されています。
私は Ruby や Python を学んだ後に PHP を学んだためか、この「ほとんど同じツールが複数用意されていること」に若干の気持ち悪さを感じます。
余談ですが、上掲の Stack Overflow の記事の中で「ゴリラとサメはどちらが強い?」風の議論に関するメタな説明をした記事が紹介されており、こちらもとてもおもしろいです。 興味のある方はご覧になってみてください。