【问题标题】:PHP Conditional Followed by Closing TagPHP 条件后跟结束标记
【发布时间】:2009-11-20 17:13:56
【问题描述】:

我对以下代码的如何工作感到困惑。在我的脑海中,我想象每个 php 块作为一个整体执行并呈现为 HTML。第一个块有点不完整的事实与我想象的 PHP 工作方式不符。 PHP 模块在到达 PHP 结束标记时会做什么? PHP标签内的代码如何影响PHP标签外的明文输出,即仅有条件地输出表单?

我原以为要完成以下操作,您实际上必须使用 echo 语句来有条件地回显表单。

<html>
<head></head>
<body>

<?php
/* if the "submit" variable does not exist, the form has not been submitted - display initial page */
if (!isset($_POST['submit'])) {
?>

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    Enter your age: <input name="age" size="2">
    <input type="submit" name="submit" value="Go">
    </form>

<?php
    }
else {
/* if the "submit" variable exists, the form has been submitted - look for and process form data */
    // display result
    $age = $_POST['age'];
    if ($age >= 21) {
        echo 'Come on in, we have alcohol and music awaiting you!';
        }
    else {
        echo 'You're too young for this club, come back when you're a little older';
    }
}
?>

</body>
</html>

【问题讨论】:

    标签: php


    【解决方案1】:

    PHP manual 解释得很中肯:

    ...当 PHP 遇到 ?&gt; 结束标签时,它会简单地开始输出它找到的任何内容(除了紧随其后的换行符 - 请参阅指令分隔),直到它遇到另一个开始标签...但输出大块文本,退出 PHP 解析模式通常比通过 echo()print() 发送所有文本更有效...

    【讨论】:

      【解决方案2】:

      php 标记之外的部分被视为在程序流的该部分中输出的文字。

      【讨论】:

        【解决方案3】:

        如果条件失败,它会跳到 php 块中的大括号末尾。其他所有内容都被视为直接进入页面的文字(而不是被视为代码)。

        【讨论】:

          【解决方案4】:

          反过来想。整个文档是 PHP,开头有一个隐含的 ?> 和一个隐含的

          ?>HTML TAGS<?
          

          等价于

          echo 'HTML TAGS';
          

          换句话说,每对倒置的 PHP 开/关大括号都封装了一个 echo 语句。

          【讨论】:

          • 进入一个人的头脑是一种糟糕的理解,实际上。更像——php标签之外的数据不被评估,但仍然是所有控制流语句的一部分。
          • 也许从编剧的角度来看。 10 年前,我创建了一个类似 PHP 的编程环境,而这正是编译器/解释器的实现方式。从编译器编写者的角度来看,这是对事物如何工作的很好理解。仅在特殊情况下评估数据,例如双引号。考虑一般性地评估数据而不是仅在特殊情况下评估数据是非常糟糕的。
          【解决方案5】:

          PHP 开发人员经常遇到在将输出发送到浏览器后发送标头和 cookie 的问题,但意外输出也可能会发生该问题。如果在 PHP 代码块结束后插入空格,则在包含该 PHP 脚本时可能会产生意外输出。

          来源:http://phpstarter.net/2009/01/omit-the-php-closing-tag/

          【讨论】:

            【解决方案6】:

            +1 伯纳德的回答。

            您可以通过使用模板级控制结构(如格式良好的标签)来使这看起来不那么奇怪/损坏,例如:

            <?php if (!isset($_POST['submit'])) { ?>
                <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
                    <label for="age">Enter your age:</label>
                    <input name="age" id="age">
                    <input type="submit" name="submit" value="Go">
                </form>
            <?php } else { ?>
                <?php
                    // Read submitted age
                    //
                    $age= intval($_POST['age']);
                ?>
                <?php if ($age >= 21) { ?>
                    Come on in, we have alcohol and music awaiting you!
                <?php } else { ?>
                    You're too young for this club, come back when you're a little older.
                <?php } ?>
            <?php } ?>
            

            注意$_SERVER['PHP_SELF']; 周围的htmlspecialchars — 这是示例代码中的跨站点脚本漏洞。另外,最后一个echo 中的撇号存在明显问题。

            【讨论】:

            • 就我个人而言,我发现启用短标签后代码变得更具可读性。这也启用了这个语法快捷方式:
            • 是的,只是那个捷径省略了重要的htmlspecialchars,所以它最终并没有那么短。我同意短标签更具可读性,但看起来它们无论如何都在淘汰。将 PHP 迁移到 XML 处理指令的想法是一个不错的想法,但不幸的是,由于它们没有提供注入属性值的方法,您仍然无法编写也是格式良好的 XML 的 PHP。因此,最终对“长标签” PI 的更改变得毫无意义。
            猜你喜欢
            • 1970-01-01
            • 2012-04-01
            • 2013-11-26
            • 1970-01-01
            • 2016-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多