【问题标题】:if Else php need explanationif Else php 需要解释
【发布时间】:2016-05-05 12:06:14
【问题描述】:

我在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)

我不需要任何替代解决方案我只是想知道为什么在第一个版本中有问题以及它有什么问题!

【问题讨论】:

  • 请修正无意义的标题。
  • 对于类似的事情使用替代语法 - 它更容易阅读。 php.net/manual/en/control-structures.alternative-syntax.php
  • “有问题”?????
  • 是的!这真的很奇怪。 Php 解析器向我显示:解析错误:语法错误,意外的 'else' (T_ELSE)
  • 请把这个细节放在问题中

标签: php


【解决方案1】:

一种考虑方法是将?&gt; ... &lt;?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";

【讨论】:

  • 这是一个有趣的类比,但它似乎只不过是一个类比。
  • 我不知道更专业的答案是什么样的,请注意。去他妈的,这样就行了!
  • &lt;?php } ?&gt; 不会打印“\n”。
  • @CooPer 详细信息可能会有所不同 - iirc ?&gt;\n 不会输出尾随换行符,但即便如此,您仍然会有 echo "";(空字符串)在 if/else 对中进行操作。跨度>
  • @NiettheDarkAbsol 确实如此,我们可以将?&gt;&lt;?php 想象成一个命令,而不是回显某些东西。你应该编辑你的帖子,因为我无法撤消投票。
【解决方案2】:

@NietTheDarkAbsol 在另一个答案中详细描述了问题的描述。我添加这个答案是为了通过删除它来为问题添加替代解决方案。

已解释的问题(@NietTheDarkAbsol 回答对此进行了描述)

通过分隔您在\n 或新行中添加的行,而else 必须始终位于开头if 的右大括号之后。

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

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

\nifs 右括号后的新行使解析器无法理解 else 与 if 相关联并引发错误。

消除对花括号的要求的另一种方法。

在使用 PHP 插入 HTML 文件时,一种特别有用的方法是使用一种替代控制结构,该控制结构无需大括号。这也将帮助您解决当前的困境,并使您的代码看起来更简洁。

<?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 (...) : 块。

【讨论】:

  • 是的,这很好,但我需要解释为什么它在上面不起作用!
  • Niet 在回答中对此进行了解释。通过分离你添加的行 \n 或新行,而 else 必须始终位于左大括号 if 之后。
猜你喜欢
  • 2015-09-12
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多