奇怪的位置打开和关闭PHP标记?

奇怪的位置打开和关闭PHP标记?,php,Php,我对编程相当陌生,已经吸收了大约150页的一本书。当下面的代码给我重重一击时,我正在顺利地使用PHP。有人能解释一下打开和关闭PHP标记的位置吗 <?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { echo "<p>Thanks for Registering</p>", "Username: ", htmlentities ($_POST['username']), "<br />",

我对编程相当陌生,已经吸收了大约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标记:

  • 上述代码结束时的开始标记
  • 其他任何东西对我来说都很难理解,请帮助我理解为什么php标记位于代码之间非常奇怪的位置。 谢谢

    PHP中的控制结构(例如循环、函数等)可以在成对的结束标记之间拆分。实际上,没有包含在PHP标记中的任何内容都只是发出,就好像它被回送一样(或者在当前输出缓冲区中捕获,如果有)。

    PHP中的控制结构(例如循环、函数等)可以在成对的结束标记之间拆分。实际上,任何未包含在PHP标记中的内容都会被发出,就好像它正在被回显(或者在当前输出缓冲区中捕获,如果有)。

    试试这个
    
    试试这个
    
    根据上的手册

    当PHP解析文件时,它会查找打开和关闭标记,这 它们告诉PHP开始和停止解释 他们之间的代码。以这种方式进行解析可以将PHP嵌入到 各种不同的文档,就像一对 PHP解析器忽略打开和关闭标记

    这意味着php标记之间的代码将是echo'd和外部代码:

    <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检查表单是否已发布,如果已发布,它将显示一条感谢消息。如果HTTP请求不是POST,它将显示一个表单供用户POST

    一般来说,混合使用HTML和PHP是不好的做法,应该避免这种结构

    按照

    当PHP解析文件时,它会查找打开和关闭标记,这 它们告诉PHP开始和停止解释 他们之间的代码。以这种方式进行解析可以将PHP嵌入到 各种不同的文档,就像一对 PHP解析器忽略打开和关闭标记

    这意味着php标记之间的代码将是echo'd和外部代码:

    <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检查表单是否已发布,如果已发布,它将显示一条感谢消息。如果HTTP请求不是POST,它将显示一个表单供用户POST


    一般来说,混合使用HTML和PHP是不好的做法,应该避免这种结构

    开始和结束
    开始和结束
    思考它的最简单方法是执行解析器所做的操作,即用php标记内的echo语句替换php标记外的内容

    这样做的主要好处是,您不必在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>";
    }
    ?>
    

    考虑这个问题最简单的方法是做解析器所做的事情,即用php标记内的echo语句替换php标记外的内容

    这样做的主要好处是,您不必在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>";
    }
    ?>
    

    PHP手册在解释实际发生的事情方面做得很差。PHP解析器肯定不会忽略块外的文本。相反,PHP解析器将该文本转换为回显操作。不相信我?您可以在源代码中自己查看。在zend_language_parser.y中,您将看到以下行:

    |   T_INLINE_HTML           { zend_do_echo(&$1 TSRMLS_CC); }
    
    当您看到
    时,它完全等同于

    语法可能看起来很奇怪,但在某些情况下它实际上非常有用。例如,我们所有的网页通常共享相同的页眉和页脚。人们通常通过在脚本开头执行include('header.html'),在脚本结尾执行include('footer.html')来处理这个问题。这不是一个非常灵活的方法。此外,最终会导致一个HTML文档的两半无法在浏览器中正确呈现

    更好的方法是使用函数声明分割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 } ?>
    
    
    

    如果您忽略
    ,那么您拥有的就是一个普通的HTML文档。再看看PHP,您会发现我有两个函数,printHeader()和printFooter()。我的所有页面现在只调用这两个函数,而不是执行include。每个页面都可以传递可选参数来处理任何特殊需求(例如,一个额外的样式表)。如果我想在我的网站上实现不同的主题,这将是非常直接的。我所要做的就是更改开始时包含的文件,以引入这些函数的不同版本。

    PHP手册在解释实际发生的情况方面做得很差。PHP解析器肯定不会忽略块外的文本。相反,PHP解析器将该文本转换为回显操作。不相信我?您可以在源代码中自己查看。在zend_language_parser.y中,您将看到以下行:

    |   T_INLINE_HTML           { zend_do_echo(&$1 TSRMLS_CC); }
    
    当您看到
    时,它完全等同于

    语法是migh
    <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>