Смешанный синтаксис для управляющих структур, генерирующих синтаксические ошибки - PullRequest
0 голосов
/ 08 октября 2008

Я рефакторинг некоторого кода PHP и обнаружил, что определенные вложенные комбинации

if () :

и

if () {

генерировать синтаксические ошибки. Не то чтобы я обычно смешивал их, но мне нравится делать частые проверки синтаксиса, когда я пишу код, и из-за этого у меня постоянно возникала ошибка синтаксиса.

Пример - генерирует синтаксическую ошибку:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) {
    if ( $test3 == 'A' ) {
    } else {
    }
  }
else :
  echo 'test2';
endif;

Пример - НЕ генерирует синтаксическую ошибку:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) :
    if ( $test3 == 'A' ) :
    else :
    endif;
  endif;
else :
  echo 'test2';
endif;

Может кто-нибудь объяснить мне, почему первый блок кода генерирует ошибку?

Ответы [ 5 ]

2 голосов
/ 08 октября 2008

Я не знаю точную причину почему. Вот связанное с сообщение об ошибке PHP , в котором разработчик в основном говорит: «Просто не делайте этого» :). В последнее время я не изучал исходный код PHP, но если мне пришлось рисковать, это связано с тем, что я не проверял альтернативный синтаксис при рекурсивном прохождении операторов if.

2 голосов
/ 08 октября 2008

Это дикое предположение, так как я не знаком с грамматикой PHP. Но здесь идет:

Проблема вторая else. Парсер не может видеть, принадлежит ли этот else первому или второму if (считая с начала). Во втором примере endif заставляет второй if -блок завершаться, чтобы он мог выполнять анализ. Возможно, это знаменитая замаскированная проблема «висящего другого»?

1 голос
/ 08 октября 2008

Проклятие, черт побери, первый пример интерпретируется как использование фигурных скобок, сопоставляемых с другим с использованием альтернативного синтаксиса.

Согласованность - это практическое правило, и интерпретация в любом случае неоднозначна для любого читателя, поэтому либо вставьте точку с запятой, как предлагается в других ответах, либо еще лучше ... очистите код. Это ужасно!

1 голос
/ 08 октября 2008

Работает нормально, если ставить точку с запятой после последней фигурной скобки:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) {
    if ( $test3 == 'A' ) {
    } else {
    }
  };
else :
  echo 'test2';
endif;
0 голосов
/ 08 октября 2008

Единственное, что я могу здесь сказать, это то, что код полностью не читается. Избегайте: как чума. Используйте знакомый синтаксис фигурных скобок в стиле C

Качество кода во многом зависит от его читабельности, поэтому постарайтесь исправить это, вы избавите себя от множества неожиданных ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...