The PHP echo language construct outputs one or more strings. It’s not a function, so it has no return value; for safe HTML output, pair it with proper escaping like htmlspecialchars().
echo は、文字列(および文字列に変換できる値)を出力するための 言語構文 です。テンプレートやデバッグで頻出ですが、実務では「そのまま出力してよい値か(XSS)」と「出力のタイミング(ヘッダ送信)」で事故が起きやすいので、基本の型と注意点をセットで覚えるのが安全です。
echo が「できること/できないこと」(出力・戻り値・式として扱えない)を説明できる.)を混同せずに使い分けられる<?= ?>(ショートエコータグ)の意味と使いどころを判断できるhtmlspecialchars)を最短で適用できるheader() が効かない「headers already sent」事故を、出力位置で切り分けられるecho と print、演算子の優先順位、複数引数の制約を正誤で判断できるecho って何?ざっくり言うと echo は「レスポンス本文に文字を足す」ための命令です。画面に見えるHTMLを作るときも、APIでJSONを返すときも、最終的には“出力”が必要になります。
まずは echo の最小形と、複数引数(カンマ区切り)を体感します。
単発の出力
複数引数(カンマ)
注意:カンマは“連結”ではない
複数引数は echo 専用の書き方です。式としてまとめたいときは .(連結)を使います。
PHP
<?php
echo 'Hello, echo!';
$id = 42;
echo 'ID: ', $id;
echo は文として書くのが基本です。関数ではないため、戻り値を前提にした書き方はしません。
PHP
<?php
echo 'text';
echo "text\n";
/* 複数引数(カンマ区切り) */
echo 'a', 'b', 'c';
/* 文字列連結(式にしたいとき) */
echo 'a' . 'b' . 'c';
echo は関数ではなく言語構文(language construct)です。一般に次の性質を持ちます。
echo ($x); のように書けるが、括弧を付けた形では複数引数が使えない(echo($a, $b) は不可)配列やオブジェクトをデバッグ出力したい場合は、var_dump() や print_r() を使います(ただし本番レスポンスに混ぜないのが基本です)。
<?= ?>(ショートエコータグ)<?= $value ?> は <?php echo $value; ?> の短縮記法です。テンプレートで「値を1つ出す」用途に向きます。
PHP
<?php
/* 通常の書き方 */
echo $title;
?>
<!-- ショートエコータグ -->
<h1><?= $title ?></h1>
ユーザー入力や外部データをHTMLへ出すときは、必ず htmlspecialchars() でエスケープします(HTML文脈)。
危険:そのまま出力
安全:HTMLとして無害化
PHP
<?php
$userInput = '<script>alert(1)</script>';
/* HTML文脈の出力は htmlspecialchars が基本 */
echo htmlspecialchars($userInput, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
PHP
<?php
header('Content-Type: application/json; charset=UTF-8');
$data = ['ok' => true, 'id' => 42];
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
APIでは「出す内容(JSON)」と「出すヘッダ(Content-Type)」をセットで扱うのが基本です。
テンプレを“表示”ではなく“文字列として組み立てたい”場合は、出力バッファを使うと整理できます。
PHP
<?php
function renderTitle(string $title): string
{
ob_start();
?>
<h1><?= htmlspecialchars($title, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></h1>
<?php
return ob_get_clean();
}
echo renderTitle('Hello');
header() が効かない(headers already sent)HTTPヘッダは、本文を出力する前に送る必要があります。先に echo(または空白・BOM・PHP閉じタグの後ろの文字)で出力が起きると、ヘッダ送信が失敗します。
?> を省略する(純PHPファイルなら基本省略)echo を置かないob_start())で出力を遅延させるecho は配列をそのまま出せません。デバッグなら var_dump()、画面表示なら用途に合わせて整形してから出力します。
連結演算子 . は、数値演算(+ など)より優先順位が低いことがあります。計算を混ぜるときは括弧で明示すると安全です。
PHP
<?php
echo 'sum=' . (2 + 3); // 安全
print との違いprint も出力しますが、print は戻り値として 1 を返します(式として使える)。一方で、実務で「戻り値が必要」な場面は少なく、基本は echo で統一する方が読みやすいことが多いです。
echoprint1。引数は1つのみ。echo は関数ではない:戻り値がなく、式としての評価を前提にしないecho $a, $b; はOKだが echo($a, $b); は不可<?= $x ?> は echo の短縮.:数値演算を混ぜるときは括弧で安全にする(優先順位問題の回避)htmlspecialchars(文脈別エスケープの考え方)header() より前に出力があると失敗するechoecho 'a', $b, 'c';(カンマ)'a' . $b . 'c'(連結)htmlspecialchars(...) を必ず併用echo の位置と「不要な出力(空白/BOM)」を疑う