缺少{
或}
由于缩进不正确
格式不匹配的代码括号通常用于格式较差的代码,例如:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
如果您的代码看起来像这样,请重新开始!否则,您或其他任何人都无法修复。在互联网上展示此内容以寻求帮助是没有意义的。
如果您可以直观地遵循if / else条件语句及其{
代码块的嵌套结构和关系,则只能修复它}
。使用您的IDE查看它们是否全部配对。
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
任何双}
}
精度不仅会关闭分支,还会关闭以前的条件结构。因此坚持一种编码风格;不要在嵌套的if / else树中混合和匹配。
除了保持一致性之外,事实证明也有助于避免冗长的条件。使用临时变量或函数以避免不可读if
的表达式。
IF
不能在表达式中使用
经常出现的新手错误是试图if
在表达式中使用语句,例如打印语句:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
这当然是无效的。
您可以使用三元条件,但要注意可读性的影响。
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
否则打破这种输出结构了:使用多个if
S和echo
小号。
更好的是,使用临时变量,并将条件放在以下位置:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
为此类情况定义功能或方法通常也很有意义。
控制块不返回“结果”
现在这已经不那么普遍了,但是一些编码人员甚至试图将其if
视为可能返回结果:
$var = if ($x == $y) { "true" };
在结构上与if
在字符串连接/表达式中使用相同。
- 但是控制结构(如果/ foreach / while)没有“结果”。
- 文字字符串“ true”也只是一个空语句。
您必须在代码块中使用分配:
if ($x == $y) { $var = "true"; }
或者,求助于?:
三元比较。
如果在
您不能if
在条件内嵌套:
⇓
if ($x == true and (if $y != false)) { ... }
这显然是多余的,因为and
(或or
)已经允许链接比较。
被遗忘的;
分号
再说一遍:每个控制块都必须是一个语句。如果先前的代码段不是以分号结尾的,那么这是可以保证的语法错误:
⇓
$var = 1 + 2 + 3
if (true) { … }
顺便说一句,{…}
代码块中的最后一行也需要用分号。
分号为时过早
现在,责怪特定的编码样式可能是错误的,因为这种陷阱很容易忽略:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
发生的次数超出您的想象。
- 当您终止
if ()
表达式时;
,它将执行void语句。在;
成为空{}
了自己的!
{…}
因此,该块与分离if
,并且将始终运行。
- 因此,
else
不再与开放if
构造有关系,这就是为什么这会导致意外的T_ELSE语法错误的原因。
这也解释了此语法错误的细微变化:
if ($x) { x_is_true(); }; else { something_else(); };
其中;
的代码之后块{…}
终止整个if
构建体,切断所述else
语法分支。
不使用代码块
从句法上讲,它可以省略花括号{
… }
对于if
/ elseif
/ else
分支中的代码块。可悲的是,这是不熟悉编码的人非常普遍的语法样式。(在错误的假设下,这样可以更快地键入或阅读)。
但是,很有可能会破坏语法。迟早会有其他语句进入if / else分支中:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
但是要实际使用代码块,您必须编写{
… }
这样!
即使是经验丰富的程序员也避免使用这种无用的语法,或者至少将其理解为该规则的例外。
Else / Elseif顺序错误
提醒自己的一件事当然是条件顺序。
if ($a) { … }
else { … }
elseif ($b) { … }
↑
可以有任意多个elseif
,但else
必须倒数第一个。就是这样。
类声明
正如上面提到的,你不能在一个类中声明的控制语句:
class xyz {
if (true) {
function ($var) {}
}
您要么忘记一个函数定义,要么}
在这种情况下过早关闭它。
意外的T_ELSEIF / T_ELSE
当混合PHP和HTML,关闭}
用于if/elseif
必须在相同PHP块<?php ?>
作为下一个elseif/else
。这将产生错误的闭合}
的if
需要是部分elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
正确的形式<?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
这或多或少是不正确缩进的变体-大概经常是基于错误的编码意图。
你不能混搭其他语句其间 if
和elseif
/ else
结构标记:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
任一种都只能出现在{…}
代码块中,而不能出现在控制结构令牌之间。
- 无论如何这是没有道理的。当PHP在
if
和else
分支之间跳转时,并不是像有些“未定义”状态。
- 您必须确定打印语句属于/的位置,或者是否需要在两个分支中重复它们。
您也不能在不同的控制结构之间分割if / else:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
和之间没有语法关系。将在词法范围结束,所以没有点的结构继续。if
else
foreach
}
if
T_ENDIF
如果意外T_ENDIF是抱怨,你正在使用的替代语法风格if:
⋯ elseif:
⋯ else:
⋯ endif;
。您应该认真考虑一下。
虽然“意外的$ end”通常是被遗忘的闭合}
花括号的价格。
分配与比较
因此,这不是语法错误,但是在这种情况下值得一提:
⇓
if ($x = true) { }
else { do_false(); }
那不是一个==
/ ===
比较,而是一个=
赋值。这相当微妙,并且很容易导致某些用户无助地编辑整个条件块。首先要小心意外的任务-每当遇到逻辑故障/行为异常时。