PHP条件语句,后跟结束标记

PHP条件语句,后跟结束标记,php,Php,我对下面的代码是如何工作的感到困惑。在我的脑海中,我想象着每个php块作为一个整体执行并呈现为HTML。事实上,第一个块有点不完整,带有一个悬挂的大括号,这与我想象中的PHP工作方式不符。当PHP模块到达PHP结束标记时,它会做什么?PHP标记内的代码如何影响PHP标记外的明文输出,即仅有条件地输出表单 我原以为要完成下面的任务,实际上必须使用echo语句有条件地回显表单 <html> <head></head> <body> <?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>


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

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

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


来源:

反过来想。整个文档都是PHP,开头有一个隐式的?>和一个隐式的,非常贴切地解释了这一点:

…当PHP点击
?>
结束标记时,它只会开始输出它找到的任何东西(除了紧跟其后的换行符-请参见指令分隔),直到它点击另一个开始标记。。。但是对于输出大块文本,退出PHP解析模式通常比通过
echo()
print()
发送所有文本更有效

+伯纳德的回答

您可以使用模板级别控制结构(如格式良好的标记)使其看起来不那么奇怪/破碎,例如:

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


实际上,进入一个人的头脑是一种不好的理解。更像–php标记之外的数据不会被计算,但仍然是所有控制流语句的一部分。可能是从脚本编写器的角度。10年前,我创建了一个类似PHP的编程环境,这正是编译器/解释器的实现方式。从编译器编写者的角度来看,这是对事物如何工作的一个很好的理解。数据仅在特殊情况下进行评估,例如双引号。如果只在特殊情况下对数据进行评估,而不是在一般情况下进行评估,那就太糟糕了。我个人认为,启用短标记后,代码的可读性会大大提高。这也使得这个语法捷径成为可能:是的,只有这个捷径省略了重要的
htmlspecialchars
,所以最后它并没有那么短。我同意短标签更具可读性,但不管怎样,它们看起来都即将过时。将PHP移动到XML处理指令的想法是很好的,但不幸的是,由于它们没有提供注入属性值的方法,所以仍然无法编写格式良好的XML的PHP。因此,最终对“长标签”PIs的更改变得毫无意义。
echo 'HTML TAGS';
<?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 } ?>