错误如果“;否则”;从一个新的php块开始


error if "else" begins with a new php block

只是想知道为什么下面的代码会出现"意外的T_ELSE"语法错误:

<?php if (isset($_SESSION["user_id"])) { ?>
            <h2>Welcome, <?php echo $_SESSION["user_id"]; ?></h2>
<?php } ?>
<?php else { ?>
    <form action="" method="post">
        <label for="user">User ID</label>
        <input type="text" id="user" />
        <label for="password">Password</label>
        <input type="password" id="password" />
        <input type="submit" value="Login" />
    </form>
<?php } ?>

当我将其他{}保持在同一行时,它运行良好。我的意思是下面的代码运行良好:

<?php if (isset($_SESSION["user_id"])) { ?>
            <h2>Welcome, <?php echo $_SESSION["user_id"]; ?></h2>
<?php } else { ?>
    <form action="" method="post">
        <label for="user">User ID</label>
        <input type="text" id="user" />
        <label for="password">Password</label>
        <input type="password" id="password" />
        <input type="submit" value="Login" />
    </form>
<?php } ?>

思考一下,我意识到这必须是预期的行为。

考虑以下(语法错误)示例:

<?php if ($condition == true) { ?>
  <div id="first">Yey</div>
<?php } ?>
<span id="second?">where am I?</span>
<?php else { ?>
  <div id="first">Ney</div>
<?php } ?>

span元素将处于未定义状态

在我看来,如果没有前面的if,就无法用else语句启动新的代码块。

你可以…

A) 将代码写在一个块中,例如

<?php }
else { ?>

B) 或者使用替代语法,如果您使用多个代码块:

<?php if (isset($_SESSION["user_id"])): ?>
    /* … */
<?php else: ?>
    /* … */
<?php endif; ?>

这本身并没有什么奇怪的,因为你在一个单独的代码块中,这是最简单的表达方式。在你"离开PHP"的时候,没有任何东西是打开的,所以当你回到它时,没有上下文。

这样考虑您的代码(当然,为了强调这一点,将其视为伪代码):

if (isset($_SESSION["user_id"])) {
    // ....
}; else {
    // ....
}

PHP的引入/退出有时可能很棘手,像在第一个示例中那样管理它并没有多大意义。

您可能需要考虑使用它,这将把您到else块的转换放在一行上:

<?php if (isset($_SESSION["user_id"])): ?>
    <h2>Welcome, <?php echo $_SESSION["user_id"]; ?></h2>
<?php else: ?>
    <form action="" method="post">
        <label for="user">User ID</label>
        <input type="text" id="user" />
        <label for="password">Password</label>
        <input type="password" id="password" />
        <input type="submit" value="Login" />
    </form>
<?php endif ?>

最后,虽然PHP非常灵活,但我不希望它能让你做你想做的事。这将允许在数英里外添加else块,这可能根本不是目的。

<?php } ?>
        ^^

当PHP解析一个文件时,它会查找打开和关闭标记,这些标记告诉PHP开始和停止解释它们之间的代码。以这种方式进行解析可以将PHP嵌入到各种不同的文档中,因为PHP解析器会忽略一对打开和关闭标记之外的所有内容。

当PHP解析器到达这一行时,它只执行if块。之后,PHP解析器试图解析下一个代码块(其他部分),但这里它从else {开始,因此elseif分离并产生错误。