PHP : echoとprintの違い

# 序文
## echo / print とは
PHP以外でも古くから、LinuxコマンドやC言語など様々な場所で存在する標準出力系の命令。
ブラウザやシステムに対して「とにかく文字列を出力する」ということをしてくれる。
echo / print について各所で調べると解説記事が散在するようなので、自分用に下記でまとめています。

## PHPでは echo / print どっちを使うべきか？
結論から言うとどちらでも良いようです。（・・・というと元も子もない感じがあるので、記事の最後に筆者の見解を示しています。）
仕様が少しだけ違いますが、自分の狭い観測範囲ではそのために使い分ける場面はほとんどないので、使い分ける場面に遭遇したらまた記事は更新します。
echo / print を使っている人の理由をそれぞれ確認すると「初めて使ったのが echo だったから」「最初に読んだ本のサンプルプログラムでは print だったから」というものが多い印象。
echo と print は、PHPマニュアル上はどちらも「String 関数」のくくりになっていますが、両者ともに厳密には「関数」ではなく「言語構造」（PHPという言語を構成する要素そのもの。他にifやarray()やuseやissetなどがある）ということには注意が必要です。

[PHPマニュアル: String 関数](https://www.php.net/manual/ja/ref.strings.php)
[PHPマニュアル: キーワードのリスト](https://www.php.net/manual/ja/reserved.keywords.php)

# 本題
## echo の仕様

[PHPマニュアル: echo — 1 つ以上の文字列を出力する](https://www.php.net/manual/ja/function.echo.php)

```php
echo ( string $arg1 [, string $... ] ) : void
```


> すべてのパラメータを出力します。末尾に改行を付加することはありません。

> echo は実際には関数ではありません (言語構造です)。このため、使用する際に括弧は必要ありません。 (いくつかの他の言語構造と異なり) echo は関数のように動作しません。

> echo には、開始タグの直後に等号を付ける短縮構文もあります。 

```php:echoを短縮構文で書いた場合
I have <?=$foo?> foo.
````

> print との主な違いは、 echo がリスト形式の引数を受け付け、返り値を持たないことです。


## print の仕様

[PHPマニュアル: print — 文字列を出力する](https://www.php.net/manual/ja/function.print.php)

```php
print ( string $arg ) : int
```

> arg を出力します。

> printは実際には関数ではありません (言語構造です)。このため、引数を括弧で括る必要はありません。

> echo との主な違いは、 print が単一の引数のみ受け付け、常に 1 を返すことです。

## というわけで両者の違い
echoのマニュアルには行末に `void` とあり、printのマニュアルには行末に `int` とありますが、これはechoが返り値を持たず、printは返り値で常に1を返すことを端的に表しています。
echoは値を持ったり返したりすることはできないため、条件分岐などで式として扱えませんが、printには返り値があるため式として利用することが可能です。
PHPの言語仕様によると、式の定義は「値のあるもの全て」だそうです。

[PHPマニュアル > 言語リファレンス > 式](https://www.php.net/manual/ja/language.expressions.php)

下記で、printとechoを式として使えるかどうかの簡単な例を記述しました。

```php:printを式として扱ってみる
if (print '') {
    print 'OK';
} else {
    print 'NG';
}
// 出力結果 OK
```

```php:echoを式として扱ってみる
if (echo '') {
    echo 'OK';
} else {
    echo 'NG';
}
// echoは返り値がない=値を持たない=式ではないので、こちらはパースエラーになる
```


違いとして他には、引数として受け付け可能な数も異なり、echoでは複数の文字を引数として与えることができますが、printでは単一の引数のみ受け付けるようになっています。

例えば複数の文字列を扱いたいときに `.` (ドット) で連結することが多いかと思いますが、echoでは `,` (カンマ) で区切ることによって第一引数、第二引数を指定して、複数の文字列の指定が可能だということです。

```php
echo 'A','B'; // カンマ使用 → 出力結果 AB
echo 'A'.'B'; // ドット使用 → 出力結果 AB

print 'A'.'B'; // ドット使用 → 出力結果 AB
print 'A','B'; // printでカンマを使って複数の文字列を出力しようとするとエラーになる
```

echoを単体で使用する場合は、省略して書くやり方もあります。

例えばHTMLファイル上で部分的にechoを使用したいとき、 `<?= ?>` のタグで囲ってあげて省略記法とすることができます。
これはPHP5.4.0未満のバージョンでは設定オプションshort_open_tag を有効にしないと使えませんが、5.4.0以降であればデフォルトで使えます。

```html:html
key : <?='value'; ?> // 出力結果 key : value
```

## ちなみに筆者は、echo派です。

printよりもechoの方がタイピングが少なくて済むため。
printは返り値があり関数的な振る舞いをする分、echoより処理速度が遅いとも言いますが、100万回くらいのprintとechoを実行したときに0.01秒の差が出るかどうかという程度のようです。（ただし出典のリンクが散逸してしまったので話半分に読んでいただければ。）
要するに慣れた方を使うか、現場のコーディング規約に従うかすれば問題ないであろうと思います。




#### 参考URL

[PHPの言語構造とは](http://yinm.hatenadiary.jp/entry/2017/02/04/012345)
[PHPのechoとprintは言語構造だというけど、言語構造とは何か](http://akisi.tabiyaku.net/?p=716)
[var_export — 変数の文字列表現を出力または返す](https://www.php.net/manual/ja/function.var-export.php)
[var_dumpよりログ作成に便利なvar_export](http://akisi.tabiyaku.net/?p=602)
[echoコマンドの詳細まとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-echo)
[PHPの省略記法](https://yokotakenji.me/log/?p=2973)
[【bash】 echoとprintfの違い](https://www.softel.co.jp/blogs/tech/archives/5427)
[PHP の echo と print のちがいと使いどころ](https://gotohayato.com/content/47)
[echo,print,printfの違い](http://innate-8.hatenablog.com/entry/2013/08/02/000414)
[あなたは『echo』派？それとも『print』派？](https://ht79.info/2012/11/29/echo_print/)
[【PHP】echoとprintfとsprintfの違い](https://www.out48.com/archives/3066/)
[【PHP超入門】式・文・構文・言語構造・制御構造について](https://qiita.com/7968/items/d739e926189e219273bd)