我正在修改一个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'; ?>
答案 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