如果语句在PHP中需要解释。

4

我写了一段 PHP 代码,并发现其中有一个问题,就像这样:

<?php if(isset($_GET['f'])) { ?>
    <?php if($_GET['f']=="message_reçus") { ?>
        -- another code here --
    <?php } ?>
<?php } ?>  
<?php else { ?>

但是当我只是这样写的时候:

<?php if(isset($_GET['f'])) { ?>
    <?php if($_GET['f']=="message_reçus") { ?>
        -- another code here --
    <?php } ?>  
<?php } else { ?>

它有效。

我需要一个清晰的解释,关于第一个版本中出现问题的原因,因为我仍然相信两个版本在语法上都是正确的!

PHP解析器显示:解析错误:语法错误,意外的“else”(T_ELSE)

我不需要任何替代方案,我只是想知道为什么第一个版本存在问题,有什么问题!


5
请修改标题,使其更具信息性。 - Mihai Stancu
针对这样的事情,使用替代语法-更容易阅读。http://php.net/manual/en/control-structures.alternative-syntax.php - PolishDeveloper
"有一个问题" - Lightness Races in Orbit
是的!这真的很奇怪。 Php解析器显示: 解析错误:语法错误,意外的'else'(T_ELSE) - Seif Eddine Slimene
1
请把这个细节放在问题里。 - Lightness Races in Orbit
2个回答

12

一种思考方式是将?> ... <?php替换为echo "...";

因此,您的代码变成了:

<?php
if(isset($_GET['f'])) {
    echo "\n\t";
    if($_GET['f'] == "message_reçus") {
        echo "\n\t\t";
        // more code here
        echo "\n\t";
    }
}
echo "\n"; // problem!
else {
    // ...
}

如果你只有 } else {,那么就不会有额外的 echo "\n"; 增加干扰。

这是一个有趣的比喻,但似乎仅仅是一个比喻而已。 - Lightness Races in Orbit
2
我不知道更技术性的答案会是什么样子,不过算了,这个就可以了! - Lightness Races in Orbit
<?php } ?> 不会输出 "\n"。 - Ali Akbar Azizi
@CooPer 细节可能有所不同 - 如果我没记错的话,?>\n 不会输出那个尾随的换行符,但即使如此,你仍然会有 echo "";(空字符串)破坏 if/else 对。 - Niet the Dark Absol
@NiettheDarkAbsol 这是真的,我们可以将 ?><?php 想象成一个命令,而不是输出内容。你应该编辑你的帖子,因为我无法取消踩。 - Ali Akbar Azizi

0

问题的描述已经在@NietTheDarkAbsol的另一个答案中详细说明。我添加这个答案是为了提供一种通过删除解决问题的替代方案。

问题说明(@NietTheDarkAbsol的答案已经描述了这个问题)

通过分离出你添加的行,你会添加一个\n或新行,而else必须始终在开放if的闭合括号之后。

<?php if ($a === $b) { ?>  
<?php } ?>  
<?php else { ?>

这被解释为if ($a === $b) { \n } \n else {

\n或者在if的闭合括号之后换行,会导致解析器无法理解else与if的关联性,从而引发错误。

一种替代方法来消除花括号的要求。

一种特别适用于将HTML文件与PHP插值的方法是使用一种替代的控制结构,以消除对花括号的需求。这也将帮助您解决当前的困境,并使您的代码看起来更加整洁。

<?php if(isset($_GET['f'])) : // Colon instead of an '{' ?>
    <?php if($_GET['f']=="message_reçus") : ?>
        <!-- HTML here -->
    <?php else : ?>
        <!-- alternative HTML here -->
    <?php endif; // endif; instead of an '}' ?>
<?php endif; ?>

由于您的代码现在不再依赖花括号,因此您的问题消失了,它正在等待endif;else :elseif (...) :块。


是的,那很好,但我需要一个解释为什么它在上面不起作用! - Seif Eddine Slimene
1
这在Niet的答案中有解释。通过分离行,您可以添加\n或新行,而else必须始终位于开放if的结束括号之后。 - David Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接