оператор if — есть ли в PHP ошибка в & quot; блоке IF & quot; метод разбора или как?

Рассмотрим следующий гипотетический пример 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;

Неправильно! Ошибка остается. Точно так же ИСКЛЮЧЕНИЕ как прежде…

Так что же не так с этими примерами?

1

Решение

Ну вот что я нашел: если поставить точку с запятой (;) ПОСЛЕ фигурная скобка (}) который находится непосредственно перед 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 или не задокументировал это. очень важно деталь!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]