Отсутствует {
или }
из-за неправильного отступа
Несоответствующие скобки кода являются общими для менее хорошо отформатированного кода, такого как:
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
оператор в выражении, например оператор print:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Что, конечно, неверно.
Вы можете использовать троичный условный код , но остерегайтесь влияния читабельности.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
В противном случае разбейте такие выходные структуры: используйте несколько if
s и echo
s .
А еще лучше, используйте временные переменные и поместите ваши условия перед:
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;
Но чтобы фактически использовать блоки кода, вы должны написать {
... }
их как таковые!
Даже опытные программисты избегают этого беспощадного синтаксиса или, по крайней мере, понимают его как исключительное исключение из правила.
Остальное / Elseif в неправильном порядке
Конечно , нужно напомнить себе об условном заказе .
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Вы можете иметь столько elseif
s, сколько хотите, но 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 } ?>
Это более или менее вариант неправильного отступа - предположительно часто основанный на неправильных намерениях кодирования.
Вы не можете помять другие операторы Inbetween 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;
. О чем стоит подумать дважды.
Типичная ошибка путает устрашающе подобное :
двоеточие для ;
точкой с запятой . (В «Точка с запятой слишком рано»)
Поскольку отступы в файлах шаблонов отслеживать сложнее, тем более при использовании альтернативного синтаксиса - вероятно, ваш endif;
не соответствует ни одному if:
.
Используя } endif;
это в два раза if
-terminator.
В то время как «неожиданный конец $» - это обычно цена за забытую }
фигурную скобку.
Назначение против сравнения
Итак, это не синтаксическая ошибка, но стоит упомянуть в этом контексте:
⇓
if ($x = true) { }
else { do_false(); }
Это не ==
/ ===
сравнение, но =
назначение . Это довольно тонко, и некоторые пользователи легко могут бесполезно редактировать целые блоки условий. Сначала следите за непреднамеренными заданиями - всякий раз, когда вы испытываете логическую ошибку / неправильное поведение.