【问题标题】:Strangely Positioned Open and Close PHP Tags?奇怪定位的打开和关闭 PHP 标签?
【发布时间】:2012-08-12 08:44:52
【问题描述】:

我对编程很陌生,已经吸收了大约 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. 上面代码开头的开始标签&lt;?php
  2. 上述代码结束时的结束标记?&gt;

还有什么让我难以理解,请帮助我理解为什么 php 标签会出现在代码之间非常奇怪的位置。 谢谢

【问题讨论】:

标签: php


【解决方案1】:

按照PHP tags上的手册

当 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,它将显示一个表单供用户发布。

一般来说,混合使用 HTML 和 PHP 并不是一个好习惯,您应该避免这种结构。

【讨论】:

  • 为什么不是好习惯? PHP 是一种模板语言;这正是它最初的设计目的。您可能的意思是,将 HTML 与 业务逻辑 混合使用是一种不好的做法。
  • PHP 处理

    之类的 html 标签没有问题,它们可以在 php 结束和开始标签之间使用,那么为什么
    标签(是 html 标签)是否有问题?为什么需要把它从php的开始和结束标签中去掉?
  • 正如@WillVousden 所说,您应该将业务逻辑与视图分开。研究 MVC、MVP 之类的模式,但如果您只是学习 PHP,最好暂时离开它,并掌握基础知识。
  • 将业务逻辑与表示代码混合起来并不是一个好习惯。 拥有演示代码并不是“不好的做法”。使用 PHP 来控制页面的外观绝对没有错。我在 OP 的代码中看到的唯一问题是它在 POST 之后不会重定向到 GET。这对用户不友好。注册过程完成后,应用应该会重定向到一个单独的新用户欢迎页面。
【解决方案2】:

考虑它的最简单方法是做解析器所做的事情,即将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>";
}
?>

【讨论】:

  • 答案看起来很有趣,如果您在使用 PC 时编辑您的帖子以包含一个示例,我将不胜荣幸。
【解决方案3】:

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

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

当您看到&lt;?php if($condition) { ?&gt;&lt;div&gt;...&lt;/div&gt;&lt;?php } ?&gt; 时,它完全等同于&lt;?php if($condition) { echo '&lt;div&gt;...&lt;/div&gt;'; ?&gt;

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

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

【讨论】:

  • 这对我来说是完全可读的。 PHP 和 HTML 代码的语法高亮显示都是正确的,因为它们是明确分开的。我可以在编辑器中轻松使用 PHP 或 HTML。如果 HTML 在 PHP 字符串中,它的可读性会差很多。
【解决方案4】:

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

【讨论】:

    【解决方案5】:
           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>';
                }
        ?>
    

    【讨论】:

      【解决方案6】:

      &lt;?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 内容,方法是用 ?&gt; 关闭 PHP 部分并输出正常的 HTML。

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

      【讨论】:

      • 也就是说 - 不建议以这种方式工作 - 混合 PHP 命令和用于显示结果的 HTML。这样做通常会导致代码难以理解和维护。查看 MVC 设计模式,了解在 Web 应用程序中组织代码的其他方法。
      【解决方案7】:

      请注意,PHP 还提供了一个alternative syntax for control structures,当它们被用于控制 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>
      

      【讨论】:

        猜你喜欢
        • 2011-07-13
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2018-07-14
        相关资源
        最近更新 更多