こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP「中括弧内にPHP終了タグ」

PHP参考書のサンプルプログラムに関しての質問です。
参考書は2013年のもので、プログラムの対応バージョンはPHP5.3、5.4、5.5と記載されています。

問題のプログラムはログインフォームのサンプルプログラムです。

<?php
~~略~~
if ($_SESSION['auth'] !== true) {
?>
<!DOCTYPE html>
<html lang="ja">
<head>
~~略~~
</head>
<body>
~~略~~
</body>
</html>
<?php
exit();
}

という内容で、

if ($_SESSION['auth'] !== true) {
?>

と{}内で一度PHP終了タグが入ることにとても違和感を感じ、色々調べているのですが、
この記述方法に関する情報が見つかりません。
サンプルプログラムは問題なく動作します。

HTMLの知識はあるのですが、現在PHPを勉強し始めたばかりです。
どなたか分かる方いますでしょうか

よろしくお願いします。

投稿日時 - 2020-06-28 13:50:39

QNo.9766106

困ってます

質問者が選んだベストアンサー

>一度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(); }」をそんな場所にまで離して書いたのか、という理由はよく分かりませんが、そういう記述も許可されるわけです。

投稿日時 - 2020-06-28 20:03:22

お礼

>「?>」は、PHPの終了タグではありません。
>phpプログラムの処理単位やプログラムの区切りを示すものではありません。
私の誤解を全て指摘していただけたような、、、
ご指摘の通り、
HTMLの開始タグ、終了タグの概念のままの私は、{}が?>や<?phpをまたぐと言うのが全くもって理解できませんでしたが、
その誤解を払拭していただき、その後読ませていただいた全てのご回答をすんなり理解することができました。
ありがとうございます。

ちなみに認証が必要なページのトップで
require_onceでこのログインフォームページを読み込むのですが、ログインしていない場合は認証が必要なページを出力しないため、exit();が最後に入っているようです。

投稿日時 - 2020-06-28 23:00:13

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ごく普通に使う記述方法です。
PHPは <?php から ?> の間をPHPで書かれたプログラムとして認識し、それ以外はHTML等で書かれたモノとして何ら処理せずそのまま出力します。
なので、?> から 次の <?php までの間は echo 文などで書き出すのと同じ結果になります。

<?php if ($_SESSION['auth'] !== true) { ?>
<!DOCTYPE html>
<?php } ?>

と書くのか

<?php
if ($_SESSION['auth'] !== true) {
echo "<!DOCTYPE html>";
}
?>

と書くのかの違いです。

投稿日時 - 2020-06-28 14:29:23

お礼

ごく普通に使う記述方法
だったのですね。急に特殊な記法が出てきたと思い混乱していたのですが、「ごく普通の記法」と言われた途端、なぜか安堵いたしました。
私の中では{}が終了タグをまたぐと言うのが全く意味が分からなかったのですが、
<?php
if ($_SESSION['auth'] !== true) {
echo "<!DOCTYPE html>";
}
?>
このサンプルプログラムと
「?> から 次の <?php までの間は echo 文などで書き出すのと同じ」
「そういうことだったのか...」と理解できました。
ありがとうございました。

投稿日時 - 2020-06-28 22:25:29

あ~それ、一般的な書き方ですよ。
<?php if (false) { ?>
ここが、HTMLとしてのコメントになる。
<?php } ?>
って書き方ですね。

要するに、今書いている物を「だれが処理するか?」の
空間を書いてるにすぎませんよ。
<?php ここはPHPが処理 ?>
こっちは普通に送り出される部分。

また、逆もありますよ。
HTML などで、<<?= $abc ?>>
これは、$abcの内容を<>で囲んだものが出力されます。

投稿日時 - 2020-06-28 13:57:49

お礼

一般的な書き方だったのですね。
<?php if (false) { ?>
ここが、HTMLとしてのコメントになる。
<?php } ?>
の構文のようにシンプルな表記を見て、なるほど納得いたしました。
とてもすっきりしました。
htmlでの<<?= $abc ?>>と言った表記
これもまた面白いテクニックですね...
1つ2つの参考書だけでは分からない記法がたくさんあるんだと思いました。
ありがとうございます。

投稿日時 - 2020-06-28 22:08:33

あなたにオススメの質問