- ベストアンサー
PHP「中括弧内にPHP終了タグ」
- PHP参考書のサンプルプログラムに関しての質問です。参考書は2013年のもので、プログラムの対応バージョンはPHP5.3、5.4、5.5と記載されています。問題のプログラムはログインフォームのサンプルプログラムで、if ($_SESSION['auth'] !== true) { の中で一度PHP終了タグが入ることに違和感を感じています。
- 質問する人は、HTMLの知識はあるが、PHPを勉強し始めたばかりのようです。
- PHPを勉強中の方がログインフォームのサンプルプログラムに関して質問しています。プログラムの中括弧内で一度PHP終了タグが入ることに違和感を感じ、情報がないか探しているようです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>一度PHP終了タグが入ることにとても違和感を感じ、色々調べているのですが、 >この記述方法に関する情報が見つかりません。 ちょっとした考えの違いです。 【「?>」は、PHPの終了タグではありません。】 ---- どういうことかって? PHPプログラムは、HTMLテキスト内に書きます。 ここでHTMLの原則に立ち戻ってみると、HTMLでのタグというのは、「<」で始まり「>」で終わる、と定義されています。 タグにパラメータがある場合、例えば <タグ名 パラメータ1=値1 パラメータ2=値2 オプションA オプションB> という感じに書きます。 そしてHTMLに定義されていない名前のついたタグは、そのタグ「<名前 ~>」が丸々無視される、というルールになっています。 つまり、HTMLの解釈上は、PHPプログラムを含んだファイルというのは、 <?php 何やら良くわからないオプションいっぱい > という知らない名前「?php」のタグが、1つあるいは複数含まれている、というだけのものに過ぎません。 一方、PHP利用可能なサーバからそのファイルを見る場合、 <?php ~ ?> によって囲まれた部分を、プログラムソースとして取り出し、実行する。 それは複数箇所に分かれていても構わない。 という事になっています。 そうすると、 <?php プログラム1行目 ?> <?php プログラム2行目 ?> <?php プログラム3行目 ?> と書いたものと、 <?php プログラム1行目 プログラム2行目 プログラム3行目 ?> は、全く同一のプログラムであるのです。 ですから、 <?php プログラム1行目 プログラム2行目 ?> (中略) <?php プログラム3行目 ?> となっていても、phpプログラム部分を抽出した場合には全く同一のプログラムとなり、ちゃんと動いてしまいます。 -- 「<?php」~「?>」というのは、HTML中にphpプログラムを置くために考案された記述方法であり、phpプログラムの処理単位やプログラムの区切りを示すものではありません。 という言うことで、なぜ]「 exit(); }」をそんな場所にまで離して書いたのか、という理由はよく分かりませんが、そういう記述も許可されるわけです。
その他の回答 (2)
- t_ohta
- ベストアンサー率38% (5238/13705)
ごく普通に使う記述方法です。 PHPは <?php から ?> の間をPHPで書かれたプログラムとして認識し、それ以外はHTML等で書かれたモノとして何ら処理せずそのまま出力します。 なので、?> から 次の <?php までの間は echo 文などで書き出すのと同じ結果になります。 <?php if ($_SESSION['auth'] !== true) { ?> <!DOCTYPE html> <?php } ?> と書くのか <?php if ($_SESSION['auth'] !== true) { echo "<!DOCTYPE html>"; } ?> と書くのかの違いです。
お礼
ごく普通に使う記述方法 だったのですね。急に特殊な記法が出てきたと思い混乱していたのですが、「ごく普通の記法」と言われた途端、なぜか安堵いたしました。 私の中では{}が終了タグをまたぐと言うのが全く意味が分からなかったのですが、 <?php if ($_SESSION['auth'] !== true) { echo "<!DOCTYPE html>"; } ?> このサンプルプログラムと 「?> から 次の <?php までの間は echo 文などで書き出すのと同じ」 「そういうことだったのか...」と理解できました。 ありがとうございました。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
あ~それ、一般的な書き方ですよ。 <?php if (false) { ?> ここが、HTMLとしてのコメントになる。 <?php } ?> って書き方ですね。 要するに、今書いている物を「だれが処理するか?」の 空間を書いてるにすぎませんよ。 <?php ここはPHPが処理 ?> こっちは普通に送り出される部分。 また、逆もありますよ。 HTML などで、<<?= $abc ?>> これは、$abcの内容を<>で囲んだものが出力されます。
お礼
一般的な書き方だったのですね。 <?php if (false) { ?> ここが、HTMLとしてのコメントになる。 <?php } ?> の構文のようにシンプルな表記を見て、なるほど納得いたしました。 とてもすっきりしました。 htmlでの<<?= $abc ?>>と言った表記 これもまた面白いテクニックですね... 1つ2つの参考書だけでは分からない記法がたくさんあるんだと思いました。 ありがとうございます。
お礼
>「?>」は、PHPの終了タグではありません。 >phpプログラムの処理単位やプログラムの区切りを示すものではありません。 私の誤解を全て指摘していただけたような、、、 ご指摘の通り、 HTMLの開始タグ、終了タグの概念のままの私は、{}が?>や<?phpをまたぐと言うのが全くもって理解できませんでしたが、 その誤解を払拭していただき、その後読ませていただいた全てのご回答をすんなり理解することができました。 ありがとうございます。 ちなみに認証が必要なページのトップで require_onceでこのログインフォームページを読み込むのですが、ログインしていない場合は認証が必要なページを出力しないため、exit();が最後に入っているようです。