Analog Studio

PHPのechoとprintの違いとは?「echoが早い」はホントなのかも検証!

概要

PHP には良く似た命令や関数が複数用意されていることがあります。
その中でも良く使う "echo" と "print" の違いってなんだろうと疑問に思った方も多いはずです。

そこで、"echo" と "print" の違いをまとめます。
また、一般的に "echo" の方が早いって言われてますが、本当かどうか検証したいと思います。

echoとprintの違いとは?

まず、どちらも PHP の命令で関数ではありません。ここは共通しています。
使用上も殆ど同じように扱うことができます。
そんな二つの違いは以下のようになっています。

項目 echo print
構文の種類
戻り値 (なし) 常に "1"
引数 複数指定できる 一つだけ

構文の種類

最大の違いは "echo" が文 (statement) なのに対して "print" は式 (expression) であることです。
つまり "echo" は "echo" のみで構文が完結して他の構文に組み込むことができませんが、"print" は式として評価されて他の構文に組み込むことができます。
分かりにくいですよね。以下の例を見て下さい。

echo 'Hello, World!'; // 問題なく実行できます。エラーもありません。 print 'Hello, World!'; // 問題なく実行できます。エラーもありません。 $a = (echo 'Hello, World!'); // echoは文を構成するのでエラーとなります。 $b = (print 'Hello, World!'); // printは式として評価されるので問題なく実行できます。

このように単体で使う分にはどちらも違いはありませんが、他の構文と組み合わせられるのは式である "print" だけです。

戻り値

上記と関連しますが、"print" は式ですので、式としての評価結果が戻り値として返ってきます。
この値は常に "1" です。どんな文字を出力しても必ず "1" です。
たとえ Boolern 型の "false" や数字の "0"、"NULL" などを出力させても戻り値だけは "1" となります。

// 以下の$a~$eには全て"1"が代入されます。 $a = print "Hello, World!"; $b = print ""; $c = print 0; $d = print false; $e = print NULL; // 以下の例では"4321"と表示されます。 // printを実行してその結果として"1"が得られるので // "432"が先に出力されて、その後に戻り値である"1"が出力されます。 echo print "432";

与えられる引数の数

"echo" にはカンマ区切りで複数の値を与えることができます。
しかし、"print" では一つだけしか引数を与えられません。

echo 'Hello', ', ', 'World!'; // 問題なく実行できます。エラーもありません。 print 'Hello', ', ', 'World!'; // 複数の引数に対応していないのでエラーが発生します。

内部的には引数の数だけ "echo" を実行しているだけらしいので、速度的には有利になりません。
しかし、カンマで区切るよりもドット演算子で文字列結合した方が分かりやすいです。

echo 'Hello'. ', '. 'World!'; // ドット演算子の方が分かりやすいと思います。 print 'Hello'. ', '. 'World!'; // こちらの方法ならprintでも問題なく実行できます。

echoとprintの実行速度の違い

理論的には戻り値の評価がない "echo" の方が高速に動作すると言われています。
確かにそんな気もしますが、実際どうなんでしょう?

そこで実際に試してみました。
その結果が以下です。このページでは読み込みの際に実際に実行させて実行時間を表示させています。

如何でしょうか?
何度か実行してみましたが殆ど変わらないか、"print" の方が早いことが多かったです。

このページは PHP7.2.6 で動作させています。
"print" が最適化されているのかレンタルサーバなのでその瞬間の負荷に依るものなのか判断はつきませんがどちらの実行速度も十分です。

まとめ

以上、"echo" と "print" の違いについてまとめました。
実行速度には違いはないので使いやすい方を使えばよいでしょう。