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

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

ことあるごとに調べては忘れ、調べては忘れの繰り返しなので、調べたところをここに書き留めておきたいと思います。

ひとことでいうと、 echoprint の最も大きなちがいはそれが「式」( expression )かどうか というところです。 言語として「 echo は式ではなく、 print は式である」ということになっているそうです。 つまり

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

とのこと。

たとえば、 echoif 文で評価することはできませんが print では可能です。

// × エラー Parse error
if (echo 5) {
    print 'echo is an expression with return value';
}

// ◯ こちらは問題なく動作する
if (print 5) {
    print 'print is an expression with return value';
}

また、 print は他の式に組み込むことができます。

// ◯ print は他の式や文の要素として利用できる
$result = 10 + (print 3) + (print FALSE);
print $result;  // => 12

// × エラー Parse error
$result = (echo 3);

ちなみに、 printFALSE を出力した場合でもその戻り値は必ず 1 となることに注意が必要です。 このあたりは Ruby の pputs のような洗練されたふるまいを期待すると裏切られます。

逆に echo にできて print にはできないことは「引数を複数受け取ること」です。 echo は複数個の引数を受け取れますが print は単一の引数しか受け取れません。

// ◯ こちらは問題なく動作します
echo 3, 4, 5;  // => 345

// × エラー 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 の方が戻り値を持たない分高速だ」とも言われていますが、実用上気にかけるほどのちがいはないようです。

最後にまとめます。

  • echoprint のちがいは「式かどうか」。 echo は式ではなく print は式である。
  • echoprint も関数ではなく言語構成( language structure )である。
  • echo の方が理論上ちょっとだけ高速だけど大差はない。

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

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