这个有效的PHP代码怎么样?

时间:2011-07-06 21:54:54

标签: php

我正在修改一个wordpress模板,我很好奇这是如何在PHP中有效的控制结构。有人有任何见解吗?

<?php if(condition): ?>
<?php if(!condition || !function()) ?>
<?php elseif(condition): ?>
<?php if(!condition || !function()) ?>
<?php endif; ?>

如果我删除所有标签,我会得到(更理智的缩进):

<?php
if(condition):
    if(!condition || !function())
elseif(condition):
    if(!condition || !function())
endif;
?>

这是无效的,因为缩进的if语句没有结束。那么如果在任何地方都有开放和关闭的php标签,这个代码如何/为什么有效呢?


编辑Kerrek SB。制作一个php文件并运行它。这是有效的:

<?php if(true): ?>
<?php if(true) ?>
<?php endif; ?>
<?php echo 'here'; ?>

7 个答案:

答案 0 :(得分:4)

您的(简化)示例代码与此相同:

<?php
if(condition):
    if(!condition || !function()) { }
endif;
?>

甚至:

<?php
if(condition):
    if(!condition || !function());
endif;
?>

通过关闭<?php标记,您似乎得到了一个&#34;空语句&#34;免费。

你的真实例子可能是如此:

<?php if(true): if(true); endif; echo 'here'; ?>

但请注意,elseif使这个变得暧昧!

<?php
if(condition):
    if(!condition || !function());
elseif(condition):   // Bogus! which block does this belong to?
    if(!condition || !function());
endif;
?>

我们必须消除歧义:

<?php
if(condition):
{
    if(!condition || !function());
}
elseif(condition):
{
    if(!condition || !function());
}
endif;
?>

现在很清楚,但现在我们可以完全放弃结肠语法。

感谢Lekensteyn指出这一点!

请参阅下面的讨论,了解更多奇怪事项。

答案 1 :(得分:2)

您的代码无效,因为如果存在?>,PHP会删除一个换行符。 ?>[newline]<?php?><?php

相同

以下内容会更有意义(function替换为fn,因为function是关键字;)):

<?php if(condition): ?>
<?php if(!condition || !fn()) ?>
some
<?php elseif(condition): ?>
<?php if(!condition || !fn()) ?>
thing
<?php endif; ?>

它被解释为:

<?php
if(condition): 
    if(!condition || !fn()) echo "some";
elseif(condition):
    if(!condition || !fn()) echo "thing";
endif;
?>

请注意,两个ifs上没有:,这些将被视为if,它们期望旁边有一个正文。用另一种方式写的:

<?php
if (condition) {
    if (!condition || !fn()) {
        echo "some";
    }
} else if (condition) {
    if (!condition || !fn()) {
        echo "thing";
    }
}
?>

答案 2 :(得分:0)

如果你没有使用,你需要跟进:嵌套if(s)之后的逻辑。

    <?php
    function foobar() {
            return true;
    }
    function bar() {
            return false;
    }

    $foobar = true;
    $bar = false;

    if($foobar):
        if(!$bar || !foobar()):
            echo 'foobar';
        endif;
    elseif($bar):     
        if(!$foobar || !bar()):
            echo 'bar';
        endif;
    endif;

答案 3 :(得分:0)

“这是无效的,因为缩进的if语句不会结束”

是的,他们这样做。正如在php.net中所述,不支持混合两种表示法,这意味着,在if(),{{if(): {{}}中,您有一个新的代码块(两个elseif():没有跟随双点) 1}}和endif;

if(condition):
    if(!condition || !function())
        // do nothing here, end of first inner if
elseif(condition):
    if(!condition || !function())
        // also do nothing here, end of second inner if
endif; // end of outer if/else

答案 4 :(得分:0)

  

这是无效的,因为缩进的if语句不会结束

实际上,他们确实如此。 ?>与其他语句一样终止语句,因此:

<?php
if(condition):
    if(!condition || !function());
elseif(condition):
    if(!condition || !function());
endif;
?>

如果不是这种情况,那么以下也会出现语法错误:

Lol <?php echo "cakes" ?> extravaganza <?php echo "innit" ?>

答案 5 :(得分:0)

我看到的是你正在混淆在php中构建'if'结构的两种可能形式。

第一种形式是:

if ( condition ) instruction;

if ( condition ) { more; than; one; instructions; }

第二个是:

if ( condition ): instruction; another; endif;

写作时

  <?php if (condition) ?>

...在结束前没有'{'或':'?'&gt;'标签,实际上你正在截断省略指令的if命令,PHP接受这个。当你再次打开php标签时,你已经在if之外了。

如果你只是“忘记”单个块中的指令,那么同样不适用,其中'endif;'不允许作为指令;

所以:

<?php if (condition) ?>
anything outside the if
<?php instruction_outside_the_if; ?>

......没有意义(因为你详细说明了if但是之后什么都不做),但这不是一个严格的错误。

<?php if (condition 1): ?> <!-- note the ':' in this if -->
<?php if (condition 2) ?>
anything outside the second if but inside the first
<?php endif; ?> <!-- this closes the first if

...这里有第一个如果有效,但第二个仍然是空的。

<?php if (condition 1): ?> <!-- note the ':' in this if -->
<?php if (condition 2) ?>
anything outside the second if but inside the first
<?php else: ?>
still outside the second if but inside the first, in the ELSE part
<?php endif; ?> <!-- this closes the first if

...这或多或少像你的例子,其中else(或elseif)属于第一个if。


<?php if (true) ?>
<?php elseif(foo){ }; ?>

这是另一个例外,因为你没有在结束标记和开始标记之间放置任何东西,所以解析器“优化”它们(不完全是这样,但它是一个正确的近似值)。尝试在两个php标签之间放置任何内容,例如:

<?php if (true) ?>
anything
<?php elseif(foo){ }; ?>

...并看到“语法错误,意外的T_ELSEIF”。

答案 6 :(得分:-1)

查看PHP.net的explaination