2

私はプログラミングの初心者で、本を 150 ページほど読みました。以下のコードが私を激しくぶつけたとき、私はPHPでスムーズに進んでいました。PHPタグの開始タグと終了タグの配置について誰でも説明できますか。

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo "<p>Thanks for Registering</p>",
    "Username: ", htmlentities ($_POST['username']), "<br />",
    "Email: ", htmlentities ($_POST['email']), "<br />";
    }
    else { ?>
    <form action = "test.php" method = "post">
            <label for = "username">Username: </label>
            <input type = "text" name = "username" />
            <label for = "email">Email: </label>
            <input type = "text" name = "email" />
            <input type = "submit" value = "Register" />
    </form>
    <?php }
?>

私が推測しているのは、PHP タグのペアは 1 つだけである必要があるということです。

  1. <?php上記のコードの最初の開始タグ
  2. ?>上記のコードの終了時の終了タグ

それ以外は理解するのが難しいので、phpタグがコード間の非常に奇妙な位置にある理由を理解するのを手伝ってください. ありがとうございました

4

7 に答える 7

2

PHPタグのマニュアルに従って

PHP がファイルを解析するとき、開始タグと終了タグを探します。これらのタグは、PHP にそれらの間のコードの解釈を開始および停止するように指示します。この方法で解析すると、PHP パーサーは開始タグと終了タグのペアの外側にあるものはすべて無視するため、あらゆる種類の異なるドキュメントに PHP を埋め込むことができます。

これは、php タグ間のコードがエコーされ、外側にあることを意味します。

<form action = "test.php" method = "post">
            <label for = "username">Username: </label>
            <input type = "text" name = "username" />
            <label for = "email">Email: </label>
            <input type = "text" name = "email" />
            <input type = "submit" value = "Register" />
</form>

通常の HTML として扱われます。上記の場合、PHP はフォームが POST されたかどうかをチェックし、そうであれば、ありがとうメッセージを表示します。HTTP リクエストが POST でない場合、ユーザーが投稿するためのフォームが表示されます。

一般に、HTML と PHP を混在させることはお勧めできません。このような構造は避けるべきです。

于 2012-08-12T08:50:06.500 に答える
1

これについて考える最も簡単な方法は、パーサーが行うこと、つまり、php タグの外側のコンテンツを php タグ内の echo ステートメントに置き換えることです。

このようにすることの主な利点は、php 文字列で HTML をエスケープする必要がないことです。さらに、適切に構造化されていれば、WYSIWYG エディターでかなりうまく表示できます。

これは、あなたが書いたものと同等で、php モードから切り替わらないコードの例です。

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo "<p>Thanks for Registering</p>",
    "Username: ", htmlentities ($_POST['username']), "<br />",
    "Email: ", htmlentities ($_POST['email']), "<br />";
}
else { 
  echo "
    <form action = \"test.php\" method = \"post\">
            <label for = \"username\">Username: </label>
            <input type = \"text\" name = \"username\" />
            <label for = \"email\">Email: </label>
            <input type = \"text\" name = \"email\" />
            <input type = \"submit\" value = \"Register\" />
    </form>";
}
?>
于 2012-08-12T08:53:40.163 に答える
1

PHP マニュアルは、実際に何が起こるかを説明するのに不十分な仕事をしています。PHP パーサーは、ブロック外のテキストを無視しません。代わりに、PHP パーサーがそのテキストをエコー操作に変換します。信じられない?ソースコードで確認できます。zend_language_parser.y には、次の行があります。

|   T_INLINE_HTML           { zend_do_echo(&$1 TSRMLS_CC); }

ご覧<?php if($condition) { ?><div>...</div><?php } ?>のとおり、 とまったく同じ<?php if($condition) { echo '<div>...</div>'; ?>です。

構文は奇妙に見えるかもしれませんが、実際には状況によっては非常に便利です。たとえば、すべての Web ページは通常、同じヘッダーとフッターを共有しています。多くの場合、スクリプトの最初に include('header.html') を実行し、最後に include('footer.html') を実行して、これを処理します。これはあまり柔軟なアプローチではありません。さらに、ブラウザーで正しくレンダリングされない 1 つの HTML ドキュメントの 2 つの半分になってしまいます。

より良い方法は、関数宣言を使用して HTML ドキュメントをスライスすることです。

<?php function printHeader($title = "Default Title", $extraJSScrpts = array(), $extraCSSFiles = array()) { ?>
<html>
    <head>
        <title>
            <?php echo $title; ?>
        </title>
    </head>
    <body>
        <div style="position: absolute; left: 150px; top: 35px;">
<?php } ?>
<?php function printFooter() { ?>
        </div>
    </body>
</html>
<?php } ?>

を無視する<?php ... ?>と、通常の HTML ドキュメントが表示されます。PHP をもう一度見てみると、printHeader() と printFooter() という 2 つの関数があることがわかります。インクルードを行う代わりに、すべてのページでこれら 2 つの関数を呼び出すだけになりました。各ページは、オプションの引数を渡して特別なニーズ (追加のスタイルシートなど) に対処できます。サイトにさまざまなテーマを実装したい場合は、非常に簡単です。私がしなければならないことは、これらの関数のさまざまなバージョンを取り込むために、最初に含めるファイルを変更することだけです。

于 2012-08-12T11:56:20.033 に答える
0
       Try this
 <?php
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            echo "<p>Thanks for Registering</p>",
            "Username: ", htmlentities ($_POST['username']), "<br />",
            "Email: ", htmlentities ($_POST['email']), "<br />";
            }
            else { 
    echo '
            <form action = "test.php" method = "post">
                    <label for = "username">Username: </label>
                    <input type = "text" name = "username" />
                    <label for = "email">Email: </label>
                    <input type = "text" name = "email" />
                    <input type = "submit" value = "Register" />
            </form>';
            }
    ?>
于 2012-08-12T08:50:02.220 に答える
0

開始タグと終了<?phpタグは、インタープリターに、どのコードが php コードであり (したがって、解釈する必要があります)、どのコードがそれ以外のもの (HTML、CSS、JS など) であるかを伝えるためのものです。

これに気付くでしょう:

echo "<p>Thanks for Registering</p>";

これは有効な PHP ステートメントであり、PHP インタープリターに送信しても問題ありません。

ただし、スクリプトの後半で、作成者はさらに多くの HTML を出力したいと考えています。もちろん、次のようなこともできます。

  echo '<form action = "test.php" method = "post">
        <label for = "username">Username: </label>
        <input type = "text" name = "username" />
        <label for = "email">Email: </label>
        <input type = "text" name = "email" />
        <input type = "submit" value = "Register" />
</form>';

?>しかし代わりに、PHP セクションを a で閉じて通常の HTML を出力することにより、この HTML コンテンツをすべて無視するようにインタープリターに指示することを選択します。

ただし、else{} ブロックを終了する必要があるため、PHP を で再度開き<?、終了 } を追加してから、終了 ?> で完了します。

于 2012-08-12T08:50:30.860 に答える
0

PHP の制御構造 (ループ、関数など) は、終了タグのペアに分割できます。事実上、PHP タグで囲まれていないものはすべて、エコーされているかのように出力されます (または、現在の出力バッファーがある場合は、そこに取り込まれます)。

于 2012-08-12T08:48:42.537 に答える
0

PHP は、 HTML の制御に使用する場合の可読性を向上させる、制御構造の代替構文も提供することに注意してください。次のコードは、アイテムのリストから交互の背景色を持つテーブルを作成します。

<table style="width: 100%">
    <?php foreach($items as $index => $item): ?>
        <?php if(!($index & 0x0001)): // even ?>
            <tr style="background-color: #FFFFAA">
                <td>
                    <?php echo $item ?>
                </td>
            </tr>
        <?php else: ?>
            <tr style="background-color: #AAFFFF">
                <td>
                    <?php echo $item ?>
                </td>
            </tr>
        <?php endif ?>
    <?php endforeach ?>
</table>
于 2012-08-12T19:02:53.150 に答える