Відсутній {
або }
через неправильне відступ
Невідповідні дужки коду є загальними для менш добре відформатованого коду, таких як:
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
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) { … }
Btw, останній рядок у {…}
кодовому блоці також потребує крапки з комою.
Точка з комою занадто рано
Зараз, мабуть, неправильно звинувачувати певний стиль кодування, оскільки цей підводний камінь занадто легко не помітити:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Що трапляється частіше, ніж ви могли собі уявити.
- Коли ви припините
if ()
вираз з;
ним, буде виконано недійсне твердження. Це ;
стає порожнім {}
власним!
- Таким
{…}
чином, блок відривається від 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;
Але щоб насправді використовувати кодові блоки, вам доведеться писати {
… }
їх як такі!
Навіть досвідчені програмісти уникають цього безглуздого синтаксису або, принаймні, розуміють його як виняток із правила.
Інше / Ельсейф у неправильному порядку
Варто нагадати про себе , звичайно, умовне замовлення .
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 } ?>
Це більш-менш варіація неправильного відступу - імовірно, часто заснована на неправильних намірах кодування.
Ви не можете перемішувати інші оператори між 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
термінатор.
У той час як "несподіваний $-кінець", як правило, ціна на забуту }
фігурну фігурну дужку.
Призначення проти порівняння
Отже, це не синтаксична помилка, але варто згадати в цьому контексті:
⇓
if ($x = true) { }
else { do_false(); }
Це не ==
/ ===
порівняння, але =
призначення . Це досить тонко і легко призведе до того, що деякі користувачі можуть безпорадно редагувати цілі блоки стану. Спершу слідкуйте за непередбачуваними завданнями - коли ви відчуваєте логічну несправність / недобре поведінку.