如果“else”以新的php块开头,则会出错

时间:2013-07-10 10:07:06

标签: php

只是想知道为什么下面的代码会出现“意外的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 个答案:

答案 0 :(得分: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块添加到数英里之外,这可能根本不是意图。

答案 1 :(得分:1)

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

你可以......

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

<?php }
else { ?>

B)或use the alternative syntax,如果您正在使用多个代码块:

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

答案 2 :(得分:1)

<?php } ?>
        ^^
  

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

当PHP解析器到达此行时,它仅执行if块。之后,PHP解析器尝试解析下一个代码块( else part ),但此处以else {开头,因此elseif分开并产生错误。

答案 3 :(得分: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元素将处于未定义状态