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. <?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 检查表单是否已经发布,如果是,它会显示一条感谢消息。如果 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>'; ?>.

语法可能看起来很奇怪,但在某些情况下它实际上非常有用。例如,我们所有的网页通常共享相同的页眉和页脚。人们通常通过在脚本开头执行 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 } ?>

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

于 2012-08-12T11:56:20.033 回答
0

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

于 2012-08-12T08:48:42.537 回答
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>';

而是选择告诉解释器忽略所有这些 HTML 内容,方法是用 a 关闭 PHP 部分?>并输出正常的 HTML。

他需要完成 else{} 块,所以用 重新打开 PHP <?,添加结束 } 然后用结束 ?>

于 2012-08-12T08:50:30.860 回答
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 回答