gotohayato.com

moon indicating dark mode
sun indicating light mode

PHP の echo と print のちがいと使いどころ

2015/07/04PHP

PHP には echoprint という 2 つのよく似た出力用機能が備わっています。

これらのちがいやそれぞれの使いどころについて、ことあるごとに調べては忘れ調べては忘れの繰り返しなので、備忘録として書き留めておきます。

早速結論ですが、ひとことでいうと、 echoprint の最も大きなちがいは式( expression )かどうか です。 PHP の仕様として「 echo は式ではなくて、 print は式である 」ということになっているそうです。

つまり

  • echo は文( statement )。他の式や文の一部として使うことができない。戻り値を持たない。
  • print は式( expression )。他の式や文の一部として使うことができる。戻り値を持っていて、それはいつも 1 。

とのこと。

文と式の区別でいうと、たとえば、わかりやすい例は if 文です。 echoif 文の中に入れることはできませんが 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 の pputs のようなふるまいを期待すると裏切られます。

となると 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 の次のページです。 興味のある方はご覧になってみてください。

ちなみに、共通点として、 echoprint も見た目上は関数のように見えますが、いずれも関数ではないとのこと。 また、変数表示の短縮形である <?= は内部的には echo として扱われているとのことです。

最後に、パフォーマンス面でのちがいとして「 echo の方が戻り値を持たない分 print よりも高速だ」と言われたりしていますが、ここは気にしても仕方がないくらいのわずかなちがいのようです。

まとめます。

  • echoprint のちがいは「式かどうか」。 echo は式ではなく print は式である。
  • echo は複数の引数を受け取ることができる。 print は引数ひとつだけ。
  • echoprint も関数ではなく言語構成( language structure )である。
  • echo の方がちょっとだけ高速だけど実用上気にするほどの差はない。

ちなみに、 PHP では echoprint の他にも、 exit()die()implode()join() など実用上大差のない機能が複数用意されています。 私は Ruby や Python を学んだ後に PHP を学んだためか、この「ほとんど同じツールが複数用意されていること」に若干の気持ち悪さを感じます。

余談ですが、上掲の Stack Overflow の記事の中で「ゴリラとサメはどちらが強い?」風の議論に関するメタな説明をした記事が紹介されており、こちらもとてもおもしろいです。 興味のある方はご覧になってみてください。

関連記事


後藤隼人
個人事業でウェブ開発やマーケティングをしています。
GitHub
© 2020 gotohayato.com
サイトについてタグ一覧記事アーカイブ