2012-03-29 5 views
8

Почему это не сработает? Появляется Синтаксическая ошибка: синтаксическая ошибка, неожиданный ':' ... в строке 7if {} in if: endif

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Но если я изменить его (только что добавили еще заявление):

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } else { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Он отлично работает.

Почему? это не ошибка PHP? Или есть правило о том, если ... иначе я должен знать?

В любом случае, я использую версию PHP 5.3.3.

+0

Пожалуйста, вставьте номера строк – JAM

+0

http://stackoverflow.com/questions/564130/difference-between-if-and-if-endif – Pheonix

+4

Интересно - и хорошая иллюстрация, почему вы, вероятно, не должны смешивать поток стиля шаблонов управляющие операторы с регулярными скобками. (или используйте стиль шаблона _at all_, если вы не кодируете HTML-представление ... но это мнение) –

ответ

14

Я не уверен, если я бы назвал это ошибкой, но я считаю, что вы с этой проблемой из-за dangling else, в сочетании с смешанным, если-то еще синтаксисом:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    }      // 4 
else:      // 5 - this else 
    $c = $a;    // 6 
endif;     // 7 

Обратите внимание, как else в строке 5 неоднозначен: он может «принадлежать» либо к первым, либо к второму операциям if.

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

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    };     // 4 - here 
else:      // 5 
    $c = $a;    // 6 
endif;     // 7 

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

+0

+1 для комментариев из записки – jprofitt

+0

О том, что я собирался написать. Только лучше. :) – GolezTrol

+0

Спасибо за ваш совет. Я не буду смешивать синтаксис. это всего лишь небольшое удивление, которое ставит под вопрос. – user1301744

1

Как указано в комментариях к PHP manual's control structure page, синтаксический анализатор не всегда считает, что if из одного стиля не следует сопоставлять с else, используя другой.

0

Форма двоеточия if/else может быть неоднозначной при работе с вложенными ifs. В вашем примере else присоединяется второй, если (как и должно быть). Чтобы этого избежать, вы должны явно дать интерпретатору знать, что это другое сопряжено с первым, если либо путем добавления else ко второму, если (как вы показываете в своем втором блоке кода), или используя {}, чтобы явно определить поток управления.

Другими словами, вы можете использовать несколько форм операторов if. Например:

if (foo): 
    //statements 
else { 
    //statements 
} 

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

Смежные вопросы