5

只是想知道为什么下面的代码会给出“意外的 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 } ?>

虽然我将 } 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 } ?>
4

4 回答 4

1

本身没有什么奇怪的,因为你在一个单独的代码块中,这是最简单的方式。在你“离开 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英里之外添加一个街区,这可能根本不是本意。

于 2013-07-10T10:21:31.350 回答
1

在我看来,你不能用else没有前面的语句来开始一个新的代码块if

你可以……</p>

A)在一个块中编写您的代码,例如

<?php }
else { ?>

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

<?php if (isset($_SESSION["user_id"])): ?>
    /* … */
<?php else: ?>
    /* … */
<?php endif; ?>
于 2013-07-10T10:22:58.493 回答
1
<?php } ?>
        ^^

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

当 PHP 解析器到达这一行时,它只执行 if 块。在那之后,PHP 解析器尝试解析下一个代码块(else part),但在这里它以 and 开头,else {因为它与它else分开if并产生错误。

于 2013-07-10T10:23:13.743 回答
1

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

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

<?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 元素将处于未定义状态

于 2013-07-10T10:46:12.503 回答