タイトル: printとechoの違い
SEOタイトル: PHP print vs echo 完全比較ガイド
| この記事の要点 |
|
結論: 基本は echo を使う
「ほぼ同じ。echo を使えば良い」が結論です。理由は以下のとおり。
- echo はカンマで複数引数を渡せる(連結より高速)
- print は戻り値 1 がある(式中で使える)が、用途は稀
- 性能差は事実上ない
echo と print の比較表
| 項目 | echo | |
|---|---|---|
| 分類 | 言語構造 | 言語構造(関数式扱い可) |
| 戻り値 | なし | 常に 1 (int) |
| 複数引数 | echo $a, $b, $c OK | NG(1 引数のみ) |
| 速度 | わずかに高速 | わずかに遅い(戻り値処理) |
| 括弧 | 付けない(付けると複数引数不可) | 付けても付けなくても可 |
| 三項演算子・式中 | 使えない | 使える |
| 使用頻度 | 圧倒的多数 | 少数 |
基本的な使い方
// echo - 基本
echo 'Hello';
echo 'Hello', ' ', 'World'; // 複数引数 OK
echo $name;
echo "Name: $name\n";
// print - 基本
print 'Hello';
print('Hello'); // 括弧付けても可
print "Name: $name\n";
// ❌ print は複数引数 NG
print 'Hello', 'World'; // Parse error
戻り値の違い(print は 1 を返す)
// print は戻り値 1
$result = print 'Hello';
echo $result; // 1
// 三項演算子の中で使える
$loggedIn ? print 'Welcome' : print 'Please login';
// 論理式の中で使える(あまり推奨されない)
$ok && print "OK\n";
// echo はこれができない
$result = echo 'Hello'; // Parse error
$ok && echo "OK\n"; // Parse error
性能比較
「echo は print より速い」とよく言われますが、1 億回ループしても差は数百ms 程度。実用上は誤差です。
// ベンチマーク例 (参考程度)
$n = 1_000_000;
$t1 = microtime(true);
for ($i = 0; $i < $n; $i++) echo '';
$echoTime = microtime(true) - $t1;
$t2 = microtime(true);
for ($i = 0; $i < $n; $i++) print '';
$printTime = microtime(true) - $t2;
printf("echo : %.3fs\n", $echoTime);
printf("print: %.3fs\n", $printTime);
// 出力例
// echo : 0.054s
// print: 0.061s
// → 1 回あたり 数十ナノ秒。気にする必要なし
連結 vs 複数引数(echo の高速化テク)
連結 (.) よりカンマで複数引数の方が高速です(文字列を内部で連結しないため):
// ❌ 遅い: 連結
echo 'Hello, ' . $name . ', age ' . $age . "\n";
// ✅ 速い: 複数引数(echo のみ可能)
echo 'Hello, ', $name, ', age ', $age, "\n";
// ✅ 文字列補間 (ダブルクォート)
echo "Hello, $name, age $age\n";
// ✅ heredoc (複数行のテンプレート)
echo <<<HTML
<div>
<p>Hello, $name</p>
</div>
HTML;
printf / sprintf でフォーマット
// printf - フォーマットして出力
printf("Hello, %s. You are %d years old.\n", $name, $age);
// sprintf - フォーマットして文字列で返す(出力しない)
$msg = sprintf("Hello, %s. You are %d years old.", $name, $age);
echo $msg;
// 主なフォーマット指定子
%s // 文字列
%d // 整数
%f // 浮動小数
%.2f // 小数点以下 2 桁
%05d // 5 桁ゼロパディング
%x // 16進数
%% // % 自体
// vsprintf - 配列を引数として渡す
$msg = vsprintf("Hello, %s. Age %d.", [$name, $age]);
短縮タグ = ?> (テンプレート)
HTML テンプレート内では <?php echo ... ?> ではなく短縮タグ <?= ... ?> が定番です。PHP 5.4+ では short_open_tag 設定に依らず常に有効:
<!-- ❌ 冗長 -->
<h1><?php echo $title; ?></h1>
<p><?php echo htmlspecialchars($desc, ENT_QUOTES, 'UTF-8'); ?></p>
<!-- ✅ 短縮タグ -->
<h1><?= $title ?></h1>
<p><?= htmlspecialchars($desc, ENT_QUOTES, 'UTF-8') ?></p>
<!-- セミコロンは省略可(タグ末尾) -->
<?= $foo ?>
Laravel Blade / Twig での書き方
{{-- Blade (Laravel) --}}
<h1>{{ $title }}</h1> {{-- 自動 htmlspecialchars --}}
<div>{!! $rawHtml !!}</div> {{-- エスケープなし(XSS 注意) --}}
{{-- Twig (Symfony) --}}
<h1>{{ title }}</h1>
<div>{{ rawHtml|raw }}</div>
{{-- echo 系命令は不要。テンプレートエンジンが裏で echo 相当を呼ぶ --}}
出力バッファリング
echo / print の出力を一旦バッファに溜めて後で取り出せます:
ob_start(); // バッファ開始
echo 'Hello, World';
$captured = ob_get_clean(); // 取り出してバッファ終了
echo $captured; // Hello, World
// HTTP ヘッダー送信後に echo すると &quot;headers already sent&quot; エラー
// → ob_start() で防げる
ob_start();
echo 'something';
header('Location: /redirect'); // OK (まだ出力されていない)
ob_end_flush();
FAQ
Q: print と echo どちらが速い?
A: 厳密には echo がわずかに速いですが、1 万回ループで数 ms の差。可読性で選んでください。
Q: print に括弧を付けるのは関数だから?
A: いいえ、print は言語構造です。括弧は任意。print("Hello") と print "Hello" は等価。
Q: echo $a $b と空白区切りで書ける?
A: 不可。カンマ echo $a, $b または連結 echo $a . $b。
Q: print_r や var_dump とは違う?
A: 全く違います。print_r / var_dump はデバッグ用の構造化出力で、配列やオブジェクトを再帰的に表示します。echo/print は単純出力。