只是想知道为什么下面的代码会出现"意外的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 {
开始,因此else
与if
分离并产生错误。