PHP, если еще альтернативный синтаксис выдает неожиданный «:» в сообщении об ошибке

Мне нужна помощь с приведенным ниже альтернативным синтаксисом if-else. Я использую это очень часто, и он работает с вероятностью успеха 99,999999%. Здесь почему-то нет:

if ( get_row_layout() == 'spacer' ) : 

    $spaceheight = get_sub_field('spacer_height');

    // The Alternative Syntax: if... else statement without a colon
    // Once these two lines are removed OR changed into "if ( some
    // condition ) : some stuff; endif;" syntax >> the error goes
    // away. 
    if ( $spaceheight && ( 0 !== $spaceheight ) )
        echo "<div class='basf-spacer' style='display: block; width: 100%; height: {$spaceheight}px; background: transparent; padding: 0; margin: 0; font-size: 0; line-height: 0;'></div>";

elseif ( get_row_layout() == 'terms' ) :

    // Some other stuff

endif;

Конкретное сообщение об ошибке: «Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное «:» в...»; и двоеточие неожиданно после альтернативного синтаксиса в строке elseif ( get_row_layout() == 'terms' ) :.

Есть идеи, что здесь происходит?


@antoni предложил ответ, что альтернативные синтаксисы нельзя смешивать. Но в этом случае, почему это работает?:

if ( $terms_primcont || $terms_seccont ) : ?>

    <div class="terms__body-wrap">

        <?php 
        if ( $terms_primcont ) echo "<div class='terms__primary'>{$terms_primcont}</div>";
        if ( $terms_seccont ) echo "<div class='terms__secondary'>{$terms_seccont}</div>";
        ?>

    </div>

<?php endif;

person Edward Munch    schedule 10.09.2017    source источник


Ответы (1)


Это происходит потому, что вы смешиваете вложенные 2 синтаксиса if. Если вы сделаете это, это сработает:

<?php
function get_row_layout(){}

if ( get_row_layout() == 'spacer' ) :

    $spaceheight = get_sub_field('spacer_height');

    // The Alternative Syntax: if... else statement without a colon
    // Once these two lines are removed OR changed into "if ( some
    // condition ) : some stuff; endif;" syntax >> the error goes
    // away.
    if ( $spaceheight && ( 0 !== $spaceheight ) ) :
        echo "<div class='basf-spacer' style='display: block; width: 100%; height: {$spaceheight}px; background: transparent; padding: 0; margin: 0; font-size: 0; line-height: 0;'></div>";
    endif;
elseif ( get_row_layout() == 'terms' ) :

    // Some other stuff

endif;

?>

[EDIT] после редактирования вопроса:

Это плохо сочетается с elseif, вы можете попробовать это, которое также имеет клюв:

$terms_primcont = 1;
$terms_seccont = 1;
if ( $terms_primcont || $terms_seccont ) :

    echo "<div class=\"terms__body-wrap\">";


        if ( $terms_primcont )
            echo "<div class='terms__primary'>{$terms_primcont}</div>";
        if ( $terms_seccont )
            echo "<div class='terms__secondary'>{$terms_seccont}</div>";


    echo '</div>';

elseif (1 === 2)
    // never do sth.
endif; 
person antoni    schedule 10.09.2017
comment
Я хотел бы думать, что это правильный ответ, но есть еще одна похожая часть кода, где я использую то же микширование (см. Обновление вопроса), но все работает нормально. Единственная разница заключается в открывающем и закрывающем HTML-теге div. - person Edward Munch; 10.09.2017
comment
Спасибо @antoni - принято как правильный ответ. Итак, резюмируя: именно elseif плохо работает со смешанным синтаксисом. Странные вещи, это точно!! - person Edward Munch; 10.09.2017