PHPでは (フォーマットの必要がないシンプルな) 文字列を出力 (表示) する場合、
echo ないし print を使用します。
この2つはいずれも、PHP Manual では、「言語構造であって関数ではない」とあります。
これは、通常の関数のように、パラメータを括弧で括る必要がないということです。
「必要がない」ということは、逆に括弧で括っても特に問題はないということでもありますが・・・
また、関数ではないので、「可変関数として使用することができません」ともあります。
では、この2つはどう違うのでしょう?
PHP Manual では、
echo は 「1 つ以上の文字列を出力する」 「値を値を返しません」
print は 「文字列を出力する」 「常に 1 を返します」 とあります。
また、echo は関数のように動作せず、
print も言語構造ですが、関数のように動作する
ともあります。具体例を示して解説してみます。
一番大きな違いは、パラメータの与え方の違いです。
echo は、複数の文字列をカンマで続けて複数の文字列を指定することができます。
print の場合は指定できる文字列は一つだけです。
以下に例を挙げてみます。
<?php $str1 = 'ありがと'; $str2 = 'です'; echo $str1, $str2; print $str1 . $str2; ?>
出力結果は、いずれの場合も 「ありがとです」 となります。
echo の場合は2つの文字列をカンマ [,] で区切り、
別のパラメータとして引き渡しています。
print の場合はパラメータを1つしか与えられないので、
ドット [.] で文字列連結して引き渡しています。
もちろん、echo で文字列連結したものを1つのパラメータとして
引き渡すことも可能です。
次の違いは、戻り値を返すかどうかの違いです。
echo は戻り値がありませんが、print は戻り値があります。
<?php $ret = echo 'ありがとです<br />'; echo ret; ?>
echo に戻り値を求め代入を行うと、上記のようにエラーとなります。
では、print を見てみましょう。
<?php $ret = print 'ありがとです<br />'; print ret; ?>
1
print の場合は 数値の [1] が戻ります。
次の違いは、関数のように動作するかどうかの違いです。
何だかよく分かりません (笑)
PHP Manual のサンプルコードを見る限りでは、
コンテキスト中で使用できるかどうか ということのように読み取れます。
<?php $var = true; ($var) ? echo 'true' : echo 'false'; ?>
echo をコンテキスト中で使用すると、上記のようにエラーとなります。
では、print を見てみましょう。
<?php $var = true; ($var) ? print 'true' : print 'false'; ?>
print の場合は コンテキスト中で使用してもエラーなく出力されます。
「コンテキストって何?」 というのはすごく説明し辛いのですが、
プログラムを制御する際の情報とか、相関関係、依存関係として
理解するとよい場合が多いです。
上記の場合では、true / false の条件判定と共に、その結果によって
出力を切り替える処理が1行のプログラムコード上で実装されています。
こういう判定部分と処理部分がプログラム言語的に切り離せない状態
の固まりのことを「コンテキスト」と私は理解しています。
echo でも上記のような動作をさせたい場合は、
<?php $var = true; if ($var) { echo 'true'; } else { echo 'false'; } ?>
のようにして、if で分岐制御をしてやることで
情報判定部分と echo の動作が明示的に切り離され、
エラーなく動作できるようになります。
また、
<?php $var = true; echo (($var) ? 'true' : 'false'); ?>
のようにして、情報判定後の結果を echo のパラメータとして指定してやることで
echo そのものが情報判定およびその結果と絡まないようにしてやることでも
正常に動作できるようになります。
なんとなく理解できましたでしょうか?
この辺は、プログラムを生業としている人間でも理解している人が
どれぐらいいるのかビミョーなところではあるのですが・・・
(当然といえば当然ですが) 戻り値を返さなくてよい分だけ
print より echo の方が速度は (わずかに) 速いと言われています。
シングルクォーテーションとダブルクォーテーションの場合と同様、
実際に速度を計測して比較されていらっしゃる方も多いですが、
これらを見ても、はっきり言って誤差の範囲です。
ここだけを局所的に見て速度パフォーマンスチューニングを行うよりは、
SQL の改善をしたり、不必要な printf や sprintf を使わないといったように
大きなボトルネックとなる可能性があるものを総合的に潰していく方が効果的です。
結果、「どちらを使ったらいいの?」というふうに感じたら、
シングルクォーテーションとダブルクォーテーションの場合と同様、
自分なりの(コーディング)ルールを定め、
それで統一すればよいのではないかと思います。
C/C++ をやっていた人は print の方が馴染みがあるでしょうし、
PHP を書籍等に準えて学習した人は echo を使う方が多いのでは
ないかと思います。
コンテキストがイマイチ理解できない方は print を使用した方が
いいかもしれませんしね。
・・・結局はこれも「好みの問題でイイんじゃない?」ってことですな。