PHP条件后跟关闭标记

时间:2009-11-19 17:54:20

标签: php

我对以下代码的如何感到困惑。在我的脑海中,我想象每个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>

6 个答案:

答案 0 :(得分:4)

PHP manual解释得非常不错:

  

...当PHP点击?>结束标记时,它只是开始输出它找到的任何内容(除了紧接着的新行 - 请参阅指令分离),直到它遇到另一个开始标记...但输出大退出PHP解析模式的文本块通常比通过echo()print()发送所有文本更有效...

答案 1 :(得分:3)

php标签之外的部分被视为在程序流程的那部分输出的文字。

答案 2 :(得分:3)

反过来想一想。整个文档是PHP,带有隐含的?&gt;在开始和隐含&lt;?在最后。然后你得到这些等价物:

?>HTML TAGS<?

等同于

echo 'HTML TAGS';

换句话说,每对反向的PHP打开/关闭括号都封装了一个echo语句。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

+1 Bernard的答案。

通过使用模板化控制结构(如格式良好的标签),您可以使这种外观不那么奇怪/破坏,例如:

<?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 } ?>

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