PHP学習コラム第2回 『開始タグと終了タグの適切な書き方』「ぺち子の目指せPHP初級試験合格!」

PHP学習コラム第2回 『開始タグと終了タグの適切な書き方』「ぺち子の目指せPHP初級試験合格!」
※この記事は読者によって投稿されたユーザー投稿のため、編集部の見解や意向と異なる場合があります。また、編集部はこの内容について正確性を保証できません。

こんにちは~、ぺち子です!
前回の info.php は動きましたか?
動いたことにして、今日のテーマに進みましょう!

今日のテーマは、『開始タグと終了タグの適切な書き方』です。

PHPの開始タグと終了タグとは、「<?php」と「?>」のことですね。
私は最初この2つに何の疑問も持たずに適当に使っていましたが、いくつか知っておかなければならないことがあったのです!

その前に、ちょっとしたおさらいです。

前回の info.php では、PHPのコードを「<?php」と「?>」でこのように囲いました。

------------------------------------------------------------
<?php
phpinfo();
?>
------------------------------------------------------------

これは、次のように一行でも書けます。

------------------------------------------------------------
<?php phpinfo(); ?>
------------------------------------------------------------

がっつりPHPを書く場合は前者を、HTMLの中にちょこっとだけPHPを埋め込むときには後者の形を使うことが多いです。
「HTMLの中にちょこっとPHPを埋め込む」とは、例えばこんな感じです。

[index.php(1)]
------------------------------------------------------------
<html>
<head>
<title>トップページ</title>
</head>
<body>
今日は<?php echo date("Y年m月d日"); ?>です!
</body>
</html>
------------------------------------------------------------

会社のプロジェクトのように体系立てで開発を行うような場合は、こんな風にHTMLとPHPが混ざったりしませんが(分ける方法があるのです)、WordPressなどのCMSでは、このような書き方が使われています。
また、PHPのファイルでは、「<?php」と「?>」で囲った部分以外はすべてHTMLとして解釈されるので、わざわざ次のように書いたりはしません。

[index.php(2)]
------------------------------------------------------------
<?php
echo "<html>";
echo " <head>";
echo " <title>トップページ</title>";
echo " </head>";
echo " <body>";
echo " 今日は" . date("Y年m月d日") . "です";
echo " </body>";
echo "</html>";
?>
------------------------------------------------------------

ところで、古いPHPコードでは開始タグ「<?php」の代わりに「<?」を使用しているものもありますが、これは非推奨です。
php.ini の設定で「<?」の使用を禁止していなければ、今でも一応使うことはできるのですが、HTMLファイルの先頭にあるXMLのタグ(<?xml …>)がPHPコードだと勘違いされちゃったり、想定外なことになる可能性があるので、特別な理由がなければ「<?php」を使うべきです。

最後に、これが一番重要なのですが、終了タグ「?>」の省略についてです。

PHPは、終了タグ「?>」、またはファイルの終端(EOF)でPHPコードが終わると解釈するので、ファイルの最後に終了タグが来る場合、終了タグを省略することができます。

[info.php]
------------------------------------------------------------
<?php
phpinfo();
------------------------------------------------------------

そして、「ファイルの最後の終了タグは省略した方がいい(するべきである)」という人も少なくありません。

その理由を説明する前に、次の2つのPHPファイルを見てください。
ブラウザでは、redirect.php の方にアクセスします。

[url.php]
------------------------------------------------------------
<?php
$url = "http://www.example.com";
?>
------------------------------------------------------------

[redirect.php]
------------------------------------------------------------
<?php
// url.php を読み込む
include "url.php";
// $url のリンクにリダイレクトする
header("Location: " . $url);
?>
------------------------------------------------------------

[Wikipedia:リダイレクト]
http://bit.ly/KVvGyd
[PHPマニュアル:include]
http://jp2.php.net/manual/ja/function.include.php
[PHPマニュアル:header]
http://php.net/manual/ja/function.header.php

redirect.php から include された url.php で、変数 $url を定義しています。
このとき、問題になるのは、url.php の終了タグです。

もし、この url.php の終了タグの後ろにスペースが入力されていたらどうなるでしょうか。

[url.php(2)]
------------------------------------------------------------
<?php
$url = "http://www.example.com";
?> ←ここにスペース
------------------------------------------------------------

もしくは、終了タグの後ろに改行が2つあったら…?

[url.php(3)]
------------------------------------------------------------
<?php
$url = "http://www.example.com";
?>
←2つ目の改行
------------------------------------------------------------

結論から言うと、url.php(2) や url.php(3) を include した redirect.php はPHPエラーで動きません。

PHPファイルでは、PHPコード以外の部分はHTMLとして出力されます。
つまり、url.php(2) を実行すると、スペースが1つ出力されます。

また、終了タグの直後の改行は無視されますが、その後の改行は無視されません。
つまり、url.php(3) を実行すると、改行が1つ出力されます。

「別にスペースや改行くらい出力されても問題ないのでは?」
「どうせブラウザで表示するときには無視されるし…」

と思いますよね!?

でもこの例の場合、続きのPHPコードの中に、リダイレクトするための header 関数があります。
header 関数は、HTMLの出力がまだ何もないときにしか使えず、そうでないときにはエラーになっちゃいます。

WebサーバにあるHTMLファイルは、通信に使う「ヘッダー」という部分と、表示に使う「HTML文書」に分かれています。
テキストファイルとして編集するときには「HTML文書」しか見えませんが、PHPでは「ヘッダー」の方も操作できます。
で、header 関数はこの「ヘッダー」を操作するものなので、「HTML文書」よりも先に操作する必要があるのです。

ファイルが増えてくると、このエラーがどこで起きているのか探すのも大変になります。
「?>」の後ろに余計なスペースや空白がないか毎回チェックするのも一苦労です。

そのため、「ファイルの最後の終了タグは省略した方がいい(するべきである)」と言われています。

私個人の意見としては、開始タグがあるんだから、終了タグもちゃんと書いた方がいいと思っていますけどね!笑
私が前に参加していたプロジェクトでは、「終了タグはちゃんと書く。ただし、終了タグの後ろは改行しない」というコーディングルールがありました。

ではでは、まとめです。

終了タグを書くにしろ省略するにしろ、開発者同士でコーディングルール(どういう体裁でコードを書くか)を統一するべきです。
ある人は終了タグを省略しているのに、別の人は書いていたりしたら、煩雑になっちゃいますからね。

1人で開発するときも、自分なりのコーディングルールを持つことは、メンテナンス性を保つためにも重要です。
昔の自分が書いたコードというのは、「ほんとにこれ自分が書いたの?」と思うことが多いんです。
自分で書いたメモなのに、字がが汚くて後から読めなくなっちゃう人っていますよね。あんな感じです。笑
ルールに沿っていれば、後からでも割と読みやすくなりますよね。

さて、あなたはどういうルールにしますか?

************************************************************

「ぺち子の目指せPHP初級試験合格!」PHP学習コラム目次

第一回
「info.phpを作成し、ブラウザで表示させる おまけ:GUNDAM」
http://on.fb.me/K5jfiq

第二回
「開始タグと終了タグの適切な書き方」
http://on.fb.me/MwF3T4

第三回
「ホワイトスペースと大文字小文字の使い方」
http://on.fb.me/KzPf1T

第四回
「ダブル&シングルクォートと、ヒアドキュメントの使いどころ」
http://on.fb.me/KCYklK

この記事が役に立ったらシェア!
tweet2このエントリーをはてなブックマークに追加
みんなが読んでるWeb担メルマガで、あなたも最新情報をチェック
  • SEOやアクセス解析のなどノウハウをゲット
  • 事例やインタビューも見逃さない
  • 要チェックのセミナー情報も届く
  • 編集長コラムを一足先に読める

日本赤十字社 東日本大震災 義援金募集
みんなが読んでるWeb担メルマガで、あなたも最新情報をチェック
  • SEOやアクセス解析のなどノウハウをゲット
  • 事例やインタビューも見逃さない
  • 要チェックのセミナー情報も届く
  • 編集長コラムを一足先に読める

今日の用語

EMD
EMDは「Exact Match Domains」の略で、「完全一致ドメイン名」 ... →用語集へ

連載/特集コーナーから探す

インフォメーション

Web担のメルマガを購読しませんか?
Web担の記事がコンパクトに毎週届くメールマガジン「Web担ウィークリー」は、10万人が読んでいる人気メルマガ。忙しいあなたの情報収集力をアップさせる強い味方で、お得な情報もいち早く入手できます。

Web担に広告を掲載しませんか?
購読者数10万人のメールマガジン広告をはじめとする広告サービスで、御社の認知向上やセミナー集客を強力にお手伝いいたします。

サイトマップ
RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]

GOLD SPONSOR
さくらインターネット株式会社株式会社KDDI ウェブコミュニケーションズ株式会社日本レジストリサービスオープンテキスト株式会社トランスコスモス株式会社株式会社ハイパーボックスDomain Keeper
SPONSOR
株式会社キノトロープ株式会社アイレップ株式会社ニューズ・ツー・ユーシックス・アパート株式会社ウェブアンテナ株式会社サイバーエージェント富士通株式会社Sitecore