Рассмотрим следующий гипотетический пример PHP:
$bar = 'bar';
$foo = 'foo';
if (isset($bar)):
if (isset($foo)) echo "Both are set.";
elseif (isset($foo)):
echo "Only 'foo' is set.";
else:
echo "Only 'bar' is set.";
endif;
Откажитесь от глупой логики и сосредоточиться на elseif
линия. Если вы попробуете сами, вы получите PHP ИСКЛЮЧЕНИЕ ошибка «синтаксическая ошибка, неожиданно ‘:’ «
Теперь вы можете подумать, что исправитьif
заключенный между { }
вместо того, чтобы быть однострочным оператором, вот так:
$foo = 'foo';
$bar = 'bar';
if (isset($bar)):
if (isset($foo)) {
echo "Both are set.";
}
elseif (isset($foo)):
echo "Only 'foo' is set.";
else:
echo "Only 'bar' is set.";
endif;
Неправильно! Ошибка остается. Точно так же ИСКЛЮЧЕНИЕ как прежде…
Так что же не так с этими примерами?
Ну вот что я нашел: если поставить точку с запятой (;
) ПОСЛЕ фигурная скобка (}
) который находится непосредственно перед elseif
Скажите, тогда ошибка исчезла! Попытайся:
$foo = 'foo';
$bar = 'bar';
if (isset($bar)):
if (isset($foo)) {
echo "Both are set.";
};
elseif (isset($foo)):
echo "Only 'foo' is set.";
else:
echo "Only 'bar' is set.";
endif;
Как ни странно, если вы вернетесь к первому примеру и удвоите точку с запятой непосредственно перед elseif
Заявление, это также будет работать:
$foo = 'foo';
$bar = 'bar';
if (isset($bar)):
if (isset($foo)) echo "Both are set.";;
elseif (isset($foo)):
echo "Only 'foo' is set.";
else:
echo "Only 'bar' is set.";
endif;
Но это не заканчивается там. Вы также можете сделать это:
$foo = 'foo';
$bar = 'bar';
if (isset($bar)):
if (isset($foo)): echo "Both are set.";
elseif (isset($foo)):
echo "Only 'foo' is set.";
else:
echo "Only 'bar' is set.";
endif;
Тем не менее, в этом последнем примере, логика полностью запуталась! elseif
теперь будет принадлежатьif
вместо первого if
и вся остальная логика будет вести себя как «одно единственное утверждение» в ответ на первое if
только. Очень запутанно и подвержено ошибкам (будьте осторожны).
Различия очень тонкие и могут обмануть глаза (особенно при отладке). По этой причине я настоятельно рекомендую первый пример из этого ответа: при использовании блоков IF-ELSEIF (AKA «Альтернативный синтаксис»), если внутри него требуется другой IF, заключите его между {}
и не забудьте добавить точку с запятой после последнего }
, Пример:
if (isset($bar)):
if (isset($foo)) {
echo "Both are set.";
};
elseif (...):
Возможно, правда в том, что кто-то облажался в процессе синтаксического анализа этих альтернативных операторов PHP или не задокументировал это. очень важно деталь!
Других решений пока нет …