PHPタグとは、ファイル内でPHPコードとして解析・実行される範囲を示す構文です。
基本的には、次のように記述します。
<?php
echo 'こんにちは';
?>
<?phpはPHPコードの開始を示し、?>はPHPコードの終了を示します。
PHPを実行できる環境では、PHPタグで囲まれた部分がプログラムとして処理されます。
一方、PHPタグの外側に記述されたHTMLなどは、PHPコードとしては解析されず、通常の出力内容として扱われます。
たとえば、次のコードがあります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPのサンプル</title>
</head>
<body>
<h1><?php echo 'こんにちは'; ?></h1>
</body>
</html>
PHPが実行された後、ブラウザにはおおむね次のHTMLが送られます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPのサンプル</title>
</head>
<body>
<h1>こんにちは</h1>
</body>
</html>
ブラウザがPHPコードを直接実行するわけではありません。
PHPは通常、サーバー側で実行され、その結果がブラウザへ送信されます。
<?phpの直後には空白または改行が必要
PHPの開始タグである<?phpの直後には、半角スペース、タブ、改行などの空白文字が必要です。
次の書き方は正しいです。
<?php
echo 'こんにちは';
?>
同じ行に続けて書くこともできます。
<?php echo 'こんにちは'; ?>
一方、次のように<?phpの直後へ文字を続けて書くことはできません。
<?phpecho 'こんにちは';
この書き方では、PHPの開始タグとして正しく認識されません。
短縮echoタグとは
PHPでは、値を出力する場合に短縮echoタグを使用できます。
<?= $name ?>
これは、次のコードと同じ意味です。
<?php echo $name; ?>
HTMLの中へ変数の値を埋め込むときに、よく使われます。
<?php
$name = '山田';
?>
<h1><?= $name ?>さん、こんにちは</h1>
PHPの実行結果は、次のようになります。
<h1>山田さん、こんにちは</h1>
<?=と<?の違い
短縮echoタグの<?=と、ショートオープンタグの<?は別の構文です。
短縮echoタグは、次のように使用します。
<?= $name ?>
一方、次の書き方はショートオープンタグです。
<?
echo $name;
?>
ショートオープンタグは、PHPの設定によっては使用できません。
そのため、通常のPHPコードでは、次の標準的な開始タグを使用します。
<?php
echo $name;
?>
値を簡潔に出力したい場合は、次の短縮echoタグを使用します。
<?= $name ?>
基本的には、<?phpと<?=の2種類を使用すれば問題ありません。
変数を書くだけでは画面に表示されない
PHPでは、変数や値を記述しただけでは、画面には表示されません。
次のコードでは、何も出力されません。
<?php
$name = '山田';
$name;
?>
変数の値を表示するには、echoを使用します。
<?php
$name = '山田';
echo $name;
?>
または、短縮echoタグを使用します。
<?php
$name = '山田';
?>
<p><?= $name ?></p>
$name;と書いた場合、PHPは式として評価しますが、その値を自動的に画面へ出力するわけではありません。
PHPタグを閉じる直前のセミコロン
PHPでは、通常、命令の最後にセミコロン;を付けます。
<?php
$name = '山田';
echo $name;
?>
ただし、PHPの終了タグ?>の直前にある最後の命令では、セミコロンを省略できる場合があります。
次のコードは有効です。
<?php echo 'こんにちは' ?>
短縮echoタグでも、セミコロンは省略できます。
<h1><?= $title ?></h1>
次のように書いても問題ありません。
<h1><?= $title; ?></h1>
どちらも正しい書き方です。
ただし、通常のPHPコードでは、可読性や統一性のためにセミコロンを書くのが一般的です。
<?php
echo 'こんにちは';
?>
PHPだけのファイルでは終了タグを省略する
PHPコードだけで構成されたファイルでは、最後の終了タグ?>を省略するのが一般的です。
<?php
$name = '山田';
echo $name;
終了タグを書かなくても、PHPファイルとして正常に動作します。
終了タグを省略する理由
終了タグの後ろに、意図しない空白や改行が入ることを防ぐためです。
たとえば、次のようなファイルがあるとします。
<?php
$name = '山田';
?>
見た目では分かりにくくても、終了タグの後ろに改行や空白が入っている場合があります。
その空白が先に出力されると、HTTPヘッダーやCookieの送信時にエラーが発生することがあります。
代表的なエラーは次のとおりです。
Cannot modify header information - headers already sent
そのため、PHPだけのファイルでは次の形式がよく使われます。
<?php
declare(strict_types=1);
function calculateTotal(int $price, int $quantity): int
{
return $price * $quantity;
}
HTMLを含むファイルでも終了タグは必須ではない
HTMLを含むファイルだからといって、必ずPHPの終了タグが必要になるわけではありません。
終了タグが必要なのは、PHPモードを終了して、HTMLをPHPタグの外側へ直接記述したい場合です。
たとえば、次のコードではPHPタグを閉じています。
<?php
$title = 'トップページ';
?>
<h1><?= $title ?></h1>
PHPタグを閉じることで、その後の<h1>を通常のHTMLとして記述できます。
一方、HTMLをechoで出力する場合は、PHPタグを閉じる必要はありません。
<?php
$title = 'トップページ';
echo '<h1>' . $title . '</h1>';
つまり、HTMLを含むファイルだから必ず?>が必要なのではありません。
PHPコードの外側へHTMLを直接記述する場合は、?>でPHPモードを終了します。
HTMLをechoなどで出力する場合は、終了タグを使用しなくても構いません。
ただし、長いHTMLをすべてechoで記述すると読みにくくなることがあります。
そのため、テンプレートでは次のようにPHPタグを開閉する方法がよく使われます。
<?php
$productName = 'ノートパソコン';
$price = 120000;
?>
<div class="product">
<h2><?= $productName ?></h2>
<p><?= number_format($price) ?>円</p>
</div>
PHPタグは何度でも開閉できる
PHPタグは、1つのファイル内で何度でも開いたり閉じたりできます。
<?php
$isLoggedIn = true;
?>
<?php if ($isLoggedIn): ?>
<p>ログインしています。</p>
<?php else: ?>
<p>ログインしてください。</p>
<?php endif; ?>
このコードでは、PHPの条件分岐とHTMLを組み合わせています。
$isLoggedInがtrueの場合は、次のHTMLが出力されます。
<p>ログインしています。</p>
falseの場合は、次のHTMLが出力されます。
<p>ログインしてください。</p>
このような書き方は、HTMLテンプレートでよく使われます。
代替構文を使うと読みやすい
HTMLとPHPを組み合わせる場合は、波括弧ではなく、次の代替構文が使われることがあります。
<?php if ($condition): ?>
<p>条件を満たしています。</p>
<?php endif; ?>
これは、次の書き方と同じ意味です。
<?php
if ($condition) {
echo '<p>条件を満たしています。</p>';
}
?>
HTMLの中では、if、else、endifを使う形式のほうが、開始位置と終了位置を把握しやすい場合があります。
PHPタグの外側はPHPコードとして解析されない
PHPタグの外側に書かれた内容は、PHPコードとしては解析されません。
たとえば、次のコードがあります。
<p>PHPタグの外側です。</p>
<?php
echo '<p>PHPから出力しました。</p>';
?>
出力結果は、おおむね次のようになります。
<p>PHPタグの外側です。</p>
<p>PHPから出力しました。</p>
PHPタグの外側はPHPパーサーによって処理されませんが、何も起こらないわけではありません。
通常は、そのまま出力内容として扱われます。
そのため、「PHPタグの外側は無視される」という表現は、PHPコードとして解析されないという意味です。
表示されないという意味ではありません。
PHPは必ずHTMLを出力するわけではない
PHPが出力する内容はHTMLに限りません。
JSON、CSV、画像データ、テキストなども出力できます。
JSONを出力する例
<?php
header('Content-Type: application/json; charset=UTF-8');
echo json_encode([
'status' => 'success',
'message' => '処理が完了しました',
], JSON_UNESCAPED_UNICODE);
この場合、PHPはHTMLではなくJSONを返します。
CSVを出力する例
<?php
header('Content-Type: text/csv; charset=UTF-8');
echo "商品名,価格\n";
echo "キーボード,5000\n";
この場合はCSV形式のデータを出力します。
コマンドラインで実行する例
<?php
echo "バッチ処理を開始します\n";
PHPはWebサーバー上だけでなく、コマンドラインでも実行できます。
その場合、ブラウザは関係ありません。
より正確には、PHPは処理結果を出力し、Web環境ではその出力がHTTPレスポンスとしてクライアントへ送られます。
PHPとJavaScriptの違い
PHPは、一般的にサーバー側で実行されます。
<?php
echo 'PHPです';
?>
一方、Webページ内のJavaScriptは、主にブラウザ側で実行されます。
<script>
console.log('JavaScriptです');
</script>
一般的な処理の流れは次のとおりです。
- ブラウザがWebサーバーへアクセスする
- WebサーバーがPHPを実行する
- PHPがHTMLやJSONなどを生成する
- Webサーバーが処理結果をブラウザへ返す
- ブラウザがHTML、CSS、JavaScriptを処理する
ただし、JavaScriptはNode.jsなどを使ってサーバー側でも実行できます。
そのため、PHPは主にサーバー側で実行され、Webページ内のJavaScriptは主にブラウザ側で実行されると理解するとよいでしょう。
PHPファイルの拡張子は通常.php
PHPコードを含むWebページは、一般的に.phpという拡張子で保存します。
index.php
contact.php
product.php
一方、次のような.htmlファイルは、一般的な設定ではPHPとして処理されません。
index.html
たとえば、index.htmlに次のコードを書いても、環境によってはPHPが実行されません。
<?php
echo 'こんにちは';
?>
実際にはサーバー設定で決まる
.phpという拡張子そのものがPHPを実行しているわけではありません。
Webサーバーが、.phpファイルをPHP実行環境へ渡すように設定されているため、PHPとして処理されます。
サーバーを設定すれば、.htmlファイルをPHPとして処理させることも可能です。
反対に、サーバー設定が間違っていれば、.phpファイルであってもPHPとして実行されない場合があります。
PHPを含むWebファイルは通常.phpで保存しますが、実際にどの拡張子をPHPとして処理するかはWebサーバーの設定によって決まります。
PHPコードは通常ブラウザから見えない
PHPが正しく設定されたサーバー上で実行されている場合、ブラウザにはPHPのソースコードではなく、実行結果だけが送られます。
たとえば、サーバー側に次のコードがあるとします。
<?php
$price = 1000;
echo $price * 3;
ブラウザへ送られる内容は、通常、次の結果だけです。
3000
PHPコード自体がブラウザへ送信されるわけではありません。
サーバー設定の不備には注意が必要
サーバーがPHPを正しく実行できない状態になっていると、PHPファイルが単なるテキストとして配信され、ソースコードが公開される可能性があります。
そのため、パスワードやAPIキーなどの重要情報をソースコードへ直接書くことは避ける必要があります。
避けたい例は次のとおりです。
<?php
$dbPassword = 'actual-password';
$apiKey = 'actual-api-key';
実務では、環境変数や秘密情報を管理するための仕組みを利用します。
<?php
$dbPassword = getenv('DB_PASSWORD');
ただし、環境変数を使用するだけですべて安全になるわけではありません。
ファイルのアクセス権限、ログ、デバッグ画面、バックアップ、サーバー設定なども適切に管理する必要があります。
古いPHPタグは使用しない
PHPには、過去に使用されていたタグ形式があります。
ショートオープンタグ
<?
echo 'こんにちは';
?>
この形式は、PHPの設定によって利用できない場合があります。
そのため、現在は次の標準タグを使用するのが基本です。
<?php
echo 'こんにちは';
?>
ASP形式
過去には、次のようなASP形式のタグも存在しました。
<%
echo 'こんにちは';
%>
現在のPHPでは使用しません。
script形式
次のような形式も、過去のPHPでは使用できました。
<script language="php">
echo 'こんにちは';
</script>
この形式も、現在は使用しません。
現在使用するPHPタグは、基本的に次の2種類です。
<?php
// PHPコード
?>
<?= $value ?>
PHPタグ内のコメント
PHPでは、次の形式でコメントを記述できます。
1行コメント
<?php
// 1行コメントです
$name = '山田';
#を使うこともできます。
<?php
# 1行コメントです
$name = '山田';
複数行コメント
<?php
/*
複数行のコメントです。
複数の行にわたって記述できます。
*/
$name = '山田';
通常、1行コメントには//がよく使われます。
<?php
// 商品価格を税込みに変換する
$taxIncludedPrice = $price * 1.1;
PHPコメントはPHPの実行結果には含まれません。
一方、HTMLコメントはブラウザへ送られる可能性があります。
<!-- HTMLコメントです -->
PHPコメントとHTMLコメントは、役割や処理される場所が異なります。
htmlspecialchars()による安全な出力
ユーザーが入力した値をHTMLへ表示する場合、そのまま出力すると、クロスサイトスクリプティングと呼ばれるセキュリティ問題につながる可能性があります。
避けたい例は次のとおりです。
<p><?= $_POST['name'] ?></p>
より安全な例は次のとおりです。
<p>
<?= htmlspecialchars(
$_POST['name'] ?? '',
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
</p>
htmlspecialchars()は、HTML上で特別な意味を持つ文字を、HTMLエンティティへ変換します。
たとえば、次のような入力があったとします。
<script>alert('XSS')</script>
そのまま出力すると、ブラウザ上でスクリプトとして解釈される危険があります。
htmlspecialchars()を使うと、通常は文字列として表示されます。
<?=自体が危険なわけではない
次の短縮echoタグ自体が危険なのではありません。
<?= $value ?>
重要なのは、出力する値の内容と、出力する場所に合った処理を行うことです。
固定された安全な文字列であれば、必ずしも毎回エスケープが必要とは限りません。
一方、ユーザー入力や外部データなど、信頼できない値をHTMLへ出力する場合は、適切なエスケープが必要です。
htmlspecialchars()だけですべて安全になるわけではない
htmlspecialchars()は、主にHTML本文やHTML属性へ値を出力する場合に使用します。
出力する場所によって、必要な処理は異なります。
HTML本文へ出力する場合
<p>
<?= htmlspecialchars(
$value,
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
</p>
これは一般的に適切な書き方です。
HTML属性へ出力する場合
<input
type="text"
value="<?= htmlspecialchars(
$value,
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>"
>
HTML属性へ出力する場合も、引用符を含めてエスケープする必要があります。
JavaScriptへ出力する場合
PHPの値をJavaScriptの文字列へ直接埋め込む場合、htmlspecialchars()だけでは不十分なことがあります。
避けたい例は次のとおりです。
<script>
const name = '<?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?>';
</script>
JavaScriptへ値を渡す場合は、json_encode()を使う方法が一般的です。
<script>
const name = <?= json_encode(
$name,
JSON_HEX_TAG
| JSON_HEX_AMP
| JSON_HEX_APOS
| JSON_HEX_QUOT
) ?>;
</script>
URLへ出力する場合
URLの一部へ値を入れる場合は、URL用のエンコードが必要です。
<a href="/search.php?q=<?= rawurlencode($keyword) ?>">
検索
</a>
ただし、最終的にはHTML属性として出力されるため、URL全体をHTML向けにエスケープする設計も必要です。
エスケープ処理は、HTML、JavaScript、URL、CSS、JSONなど、出力する文脈に合わせて選ぶ必要があります。
実践的なPHPタグの例
商品情報を表示する例は、次のように記述できます。
<?php
$product = [
'name' => 'ノートパソコン',
'price' => 120000,
'in_stock' => true,
];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>
<?= htmlspecialchars(
$product['name'],
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
</title>
</head>
<body>
<h1>
<?= htmlspecialchars(
$product['name'],
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
</h1>
<p>
価格:
<?= number_format($product['price']) ?>円
</p>
<?php if ($product['in_stock']): ?>
<p>在庫があります。</p>
<?php else: ?>
<p>現在、在庫切れです。</p>
<?php endif; ?>
</body>
</html>
データを準備する部分
<?php
$product = [
'name' => 'ノートパソコン',
'price' => 120000,
'in_stock' => true,
];
?>
ここでは、商品名、価格、在庫状況を配列として定義しています。
商品名を表示する部分
<?= htmlspecialchars(
$product['name'],
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
ここでは、商品名をHTMLへ安全に出力しています。
価格を表示する部分
<?= number_format($product['price']) ?>円
number_format()を使用すると、数値に桁区切りを付けられます。
120000は、次のように表示されます。
120,000円
在庫状況を判定する部分
<?php if ($product['in_stock']): ?>
<p>在庫があります。</p>
<?php else: ?>
<p>現在、在庫切れです。</p>
<?php endif; ?>
in_stockがtrueの場合は「在庫があります」と表示され、falseの場合は「現在、在庫切れです」と表示されます。
よくある間違い
<?phpの途中にスペースを入れる
間違った例です。
<? php
echo 'こんにちは';
?>
正しくは、<?phpを続けて書きます。
<?php
echo 'こんにちは';
?>
ただし、<?phpの後ろには改行またはスペースが必要です。
<?php echo 'こんにちは'; ?>
ファイルの拡張子を.htmlにする
一般的な環境では、PHPを含むファイルは.phpで保存します。
index.php
ただし、実際にPHPとして処理されるかどうかは、Webサーバーの設定によって決まります。
.htmlでもPHPが実行されるよう設定することはできますが、通常は.phpを使用します。
セミコロンを忘れる
間違った例です。
<?php
$name = '山田'
echo $name;
?>
正しい例です。
<?php
$name = '山田';
echo $name;
?>
ただし、終了タグの直前にある最後の命令では、セミコロンを省略できる場合があります。
<?を使用する
避けたほうがよい例です。
<?
echo 'こんにちは';
?>
推奨される書き方です。
<?php
echo 'こんにちは';
?>
変数を書くだけで表示されると思う
次のコードでは、値は表示されません。
<?php
$name = '山田';
$name;
?>
表示するにはechoを使います。
<?php
echo $name;
?>
または、短縮echoタグを使います。
<?= $name ?>
ユーザー入力をそのまま表示する
避けたい例です。
<p><?= $_POST['name'] ?></p>
HTML本文へ出力する場合の例は次のとおりです。
<p>
<?= htmlspecialchars(
$_POST['name'] ?? '',
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
</p>
ただし、JavaScriptやURLなどへ出力する場合は、それぞれの文脈に適した処理が必要です。
PHPタグの正確な定義
PHPタグとは、ファイル内でPHPコードとして解析・実行される範囲を示す構文です。
通常は<?phpでPHPモードを開始し、?>でPHPモードを終了します。
<?php
echo 'こんにちは';
?>
値を出力する場合は、短縮echoタグを使用できます。
<?= $value ?>
これは、次のコードと同じ意味です。
<?php echo $value; ?>
PHPコードだけで構成されたファイルでは、最後の終了タグを省略するのが一般的です。
<?php
echo 'こんにちは';
HTMLをPHPコードの外側へ直接記述する場合は、PHPタグを閉じます。
<?php
$title = 'トップページ';
?>
<h1>
<?= htmlspecialchars(
$title,
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
) ?>
</h1>
まとめ
PHPタグは、ファイル内でPHPコードとして処理される範囲を示すための構文です。
通常のPHPコードには、次の形式を使用します。
<?php
// PHPの処理
?>
値を表示する場合は、短縮echoタグを使用できます。
<?= $value ?>
PHPだけで構成されたファイルでは、最後の?>を省略するのが一般的です。
<?php
echo 'こんにちは';
HTMLとPHPを組み合わせる場合は、必要に応じてPHPタグを開閉できます。
<?php if ($isLoggedIn): ?>
<p>ログインしています。</p>
<?php else: ?>
<p>ログインしてください。</p>
<?php endif; ?>
特に重要なのは、次の点です。
- 通常のPHPコードには
<?phpを使う - 値の出力には
<?= ... ?>を使える - PHPだけのファイルでは、最後の終了タグを省略する
<?は環境設定に依存するため避ける- HTMLへ外部データを出力するときは、出力場所に合ったエスケープ処理を行う
- PHPはHTML以外にも、JSONやCSVなどを出力できる
PHPタグは、HTMLなどの静的な記述と、PHPによる動的な処理を切り替えるための境界線として機能します。
以上、PHPのタグとはなんなのかについてでした。
最後までお読みいただき、ありがとうございました。










