クラウド時代のWebアプリケーション・スマートフォンアプリを開発・運用する会社です。 03-4577-8680 03-6673-4950

PHPのechoとprintの違い

2011-09-18

php echo print 違いと検索してみても、だいたいはリファレンス通りの説明が書いてあります。
「echoとprintってどっち使ったらいいんですか?」と聞かれても、だいたいの人は「好きな方使えば?」と答えるんじゃないでしょうか。

さて今回は結論を先に書きますが、これを問われた時の私の答えは、
「個人的にはprintにしておくことをおすすめします」です。
もちろん好みの問題ではなくて、(異論はあると思いますが)実用的な面での結論です。

まずリファレンスを見てみましょう。

echo

echo() は実際には関数ではありません (言語構造です)。

「言語構造である」と書かれても「なんか基本的なところで動くのね」というように見えてしまいますが(そりゃもちろんそうなのですが)、悪い面を言うと「実行結果が根本的なエラーとして扱われる場合がある」ということになります。

ではprintはどうかというと、これがまたPHPリファレンスの謎なところで、printの項には無く、echoの項で触れられています。

(いくつかの他の言語構造と異なり) echo() は関数のように動作しません。

ここで間接的に触れられている「関数のように動作する」言語構造のひとつがprintです。
もちろん関数ではないので通常の関数とは挙動が異なりますが、比較的関数に近い挙動なので、実行結果が関数と同じような結果になったりします。

例を挙げましょう。

print print “hoge”;

これは hoge1 になります。hogeのprintが実行され、かつその返り値(TRUE)がprintされるのでこのような結果になるわけです。
ところが、

echo echo “hoge”;

これはsyntax errorになります。
しかも2〜3回食らわすとSegmentation faultが発生して、Webサーバのプロセスが死にます。
わざわざそんなこと書く場面なんて無いよ、とつっこまれると思いますが、コピペミスとか、ボーっとしている時には結構やらかしてしまう部類のものだと思うのです。しかも、少なくともNetBeansではこんなのを書いても警告が出ません。

普通に考えると、いきなりsyntax errorが出て画面が表示されなくなったら(エラーログ見れば行数まで指摘されているわけですが)、びっくりしてソースを見直しますよね?で、こんなのを書くくらいだからボサーっとしている状態なわけです。
しかもechoなどという基本的な記述に真っ先に疑いをかけることはしないでしょうから、しばらくソースを眺めて時間を無駄にするだろうと思うのです。

これが、画面表示上「hoge1」などとなっていれば、「あれ?Typoしたか?」ということでとりあえずすぐその記述個所を確認すると思うのですね。

ということで、冒頭の結論の意図は、極めて現実的な問題として、「本当の言語的違いはどうでもいいが、ミスった時にわかりづらくなる可能性があるのでechoは使いたくない」という理由によるものです。
仕様レベルの挙動の違いを把握していても、役に立つのは正直ZendのCertificationくらいじゃないかと思うので、実際の現場で時間を無駄にしないためのルールとして、このような結論に達したわけです。
まじめな方々には「ちゃんと違いを把握していれば云々〜」と怒られるかもしれませんけれども。

・・・

蛇足ですが、リファレンスのechoとprintの説明はさらに問題があって、「結局()って要るの?要らないの?」という疑問が出てくると思うのです。
リファレンスではどちらも

括弧は必要ありません。

と書いてあるのですが(*1)、これでは「省略可能ということなんだなー」と読めてしまいます。実際には()を付けると動作しない場合があるので、ここでの「必要ありません」は「不要です」という意味なのです。
例えば

void echo ( string $arg1 [, string $… ] )

と書いてあるからといって

echo(“hoge”,”hoge”);

と書くとまたもやsyntax errorになります。
これは

echo “hoge”,”hoge”;

と書かないと動作しません。
ページ内の記述例では一切()を使っていないわけですが、リファレンス内のリンクもecho()・print()と書いてありますし、説明書ややたらたくさんある「PHPの書き方講座」のようなサイトを見るとprint(〜)と書いてあるものも結構あるようですし、長いことPHPを書いている人でも「()って付けた方がいいんじゃないんですか?」と聞かれたらそうそう即答できないんじゃないかなと。「どっちでもOK」と言ってしまいそうですよね。


*1
元の英文に

you are not required to use parentheses with it.

と書いてあるのでそのまま訳したんだと思いますが、日本語の「必要ない」は「あってもなくても良い」というニュアンスが出てしまうので、ここは「不要」と訳した方が良かったんじゃないかと思うのです。