elseif/else if

(PHP 4, PHP 5, PHP 7, PHP 8)

Конструкция elseif, как ясно из названия, объединяет конструкции if и else. Как и конструкция else, она расширяет конструкцию if, чтобы выполнять другое выражение тогда, когда условие начальной конструкции if вычисляется как false. Отличие от конструкции else состоит в том, что конструкция elseif выполнит альтернативное выражение только тогда, когда условие elseif вычислится как true. Следующий код, в зависимости от значений переменных, будет выводить «a больше b», «a равно b» или «a меньше b»:

<?php

if ($a > $b) {
echo
"a больше b";
} elseif (
$a == $b) {
echo
"a равно b";
} else {
echo
"a меньше b";
}

?>

Допустимо указывать больше одной конструкции elseif в одной конструкции if. Выполняется первое выражение elseif, условие которого вычислено как true. PHP разрешает писать else if в два слова, тогда поведение будет идентичным конструкции elseif в одно слово. Синтаксическое отличие есть (в языке C пишут в два слова), но в итоге оба выражения дадут один и тот же результат.

Выражение elseif выполняется только тогда, когда предшествующее условие if и предшествующие условия elseif вычисляются как false, а текущее условие elseif вычисляется как true.

Замечание: Заметьте, что записи elseif и else if будут равнозначны только в синтаксисе с фигурными скобками, как в приведённом примере. В синтаксисе с двоеточием для определения условий if и elseif, конструкция elseif пишется в одно слово. Если запись конструкции else if разделена на два слова, PHP выдаст ошибку синтаксического анализа и завершит работу.

<?php

/* Некорректный способ: */
if ($a > $b):
echo
$a . " больше " . $b;
else if (
$a == $b): // Не скомпилируется.
echo "Строка выше вызывает фатальную ошибку.";
endif;


/* Корректный способ: */
if ($a > $b):
echo
$a . " больше " . $b;
elseif (
$a == $b): // Заметьте, тут одно слово.
echo $a . " равно " . $b;
else:
echo
$a . " не больше и не равно " . $b;
endif;

?>

add a note add a note

User Contributed Notes 1 note

up
-8
Vladimir Kornea
17 years ago
The parser doesn't handle mixing alternative if syntaxes as reasonably as possible.

The following is illegal (as it should be):

<?
if($a):
    echo
$a;
else {
    echo
$c;
}
?>

This is also illegal (as it should be):

<?
if($a) {
    echo
$a;
}
else:
    echo
$c;
endif;
?>

But since the two alternative if syntaxes are not interchangeable, it's reasonable to expect that the parser wouldn't try matching else statements using one style to if statement using the alternative style. In other words, one would expect that this would work:

<?
if($a):
    echo
$a;
    if(
$b) {
      echo
$b;
    }
else:
    echo
$c;
endif;
?>

Instead of concluding that the else statement was intended to match the if($b) statement (and erroring out), the parser could match the else statement to the if($a) statement, which shares its syntax.

While it's understandable that the PHP developers don't consider this a bug, or don't consider it a bug worth their time, jsimlo was right to point out that mixing alternative if syntaxes might lead to unexpected results.
To Top