PHPCon Poland 2024

elseif/else if

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

Конструкция elseif, как ясно из названия, объединяет конструкции if и else. Как и конструкция else, она расширяет инструкцию if, чтобы выполнять другую инструкцию тогда, когда PHP вычисляет выражение начальной конструкции if как false. Отличие от конструкции else состоит в том, что конструкция elseif выполнит альтернативное выражение только тогда, когда PHP вычислит условное выражение 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. PHP выполняет первое выражение elseif, которое вычисляет как true. В PHP допустимо писать else if в два слова, тогда поведение будет идентичным конструкции elseif в одно слово. Синтаксическое отличие есть (в языке C пишут в два слова), но в итоге оба выражения дадут один и тот же результат.

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

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

<?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

User Contributed Notes 1 note

up
-9
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