Есть ли в PHP ошибка в методе анализа IF-блока или как?

Рассмотрим следующий гипотетический пример 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 EXCEPTION, в котором говорится: "синтаксическая ошибка, неожиданная":

Теперь вы можете подумать, что исправить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 или не задокументировал эту очень важную деталь!

Другие вопросы по тегам