SunshinePHP Developer Conference 2015

elseif/else if

(PHP 4, PHP 5)

elseif, como su nombre lo sugiere, es una combinación de if y else. Del mismo modo que else, extiende una sentencia if para ejecutar una sentencia diferente en caso que la expresión if original se evalúe como FALSE. Sin embargo, a diferencia de else, esa expresión alternativa sólo se ejecutará si la expresión condicional del elseif se evalúa como TRUE. Por ejemplo, el siguiente código debe mostrar a es mayor que b, a es igual que b o a es menor que b:

<?php
if ($a $b) {
    echo 
"a es mayor que b";
} elseif (
$a == $b) {
    echo 
"a es igual que b";
} else {
    echo 
"a es menor que b";
}
?>

Puede haber varios elseif dentro de la misma sentencia if. La primera expresión elseif (si hay alguna) que se evalúe como TRUE sería ejecutada. En PHP también se puede escribir 'else if' (en dos palabras) y el comportamiento sería idéntico al de 'elseif' (en una sola palabra). El significado sintáctico es ligeramente diferente (si se está familiarizado con C, este es el mismo comportamiento) pero la conclusión es que ambos resultarían tener exactamente el mismo comportamiento.

La sentencia elseif es ejecutada solamente si la expresión if precedente y cualquiera de las expresiones elseif precedentes son evaluadas como FALSE, y la expresión elseif actual se evalúa como TRUE.

Nota: Tenga en cuenta que elseif y else if serán considerados exactamente iguales sólamente cuando se utilizan corchetes como en el ejemplo anterior. Al utilizar los dos puntos para definir las condiciones if/elseif, no debe separarse else if en dos palabras o PHP fallará con un error del interprete.

<?php

/* Método incorrecto: */
if($a $b):
    echo 
$a." es mayor que ".$b;
else if(
$a == $b): // No compilará
    
echo "La línea anterior provoca un error del interprete.";
endif;


/* Método correcto: */
if($a $b):
    echo 
$a." es mayor que ".$b;
elseif(
$a == $b): // Tenga en cuenta la combinación de las palabras.
    
echo $a." igual ".$b;
else:
    echo 
$a." no es ni mayor que ni igual a ".$b;
endif;

?>

add a note add a note

User Contributed Notes 7 notes

up
26
Vladimir Kornea
7 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.
up
0
qualitycoder
18 days ago
The reason 'else if' (with a space) works with traditional syntax and not colon syntax is because of a technicality.

<?php
 
if($var == 'Whatever') {

  } else if(
$var == 'Something Else') {

  }
?>

In this instance, the 'else if' is a shorthand/inline else statement (no curly braces) with the if statement as a body. It is the same things as:

<?php
 
if($var == 'Whatever') {

  } else {
      if(
$var == 'Something Else') {

      }
  }
?>

If you were to write this with colon syntax, it would be:

<?php
 
if($var == 'Whatever'):

  else:
      if(
$var == 'Something Else'):

      endif;
  endif;
?>
up
-23
Anonymous
9 months ago
In addition to what Rudi  wrote,
I ran his test script  on Debian 6 with php 5.3.26 where his findings are true, elseif is faster than else if.
Then I ran his script on Windows 7 with php 5.4.7, where results are the opposite, else if is faster than elseif.
up
-26
Anonymous
7 years ago
There is no good way to interpret the dangling else.  One must pick a way and apply rules based on that. 

Since there is no endif before an else, there is no easy way for PHP to know what you mean.
up
-21
peter dot mlich at volny dot cz
6 months ago
To  Rudi / 3 years ago

Try switch in switch($name) case 'word': break; . --- slow
Try if/else and  if/elseif in $name='word'. --- in my fast test, place 3
Try isset in isset($array[$name]). ---  place 1
Try in_array in in_array($name,$array). --- slow
Try array_key_exists in array_key_exists($name,$array).

Try return (end function) in if/elseif with  -- place 2
if('word'==$name) {
  $parsed[$name]=$text;
  return;
  } 
elseif('word'==$name) {
  $parsed[$name]=$text;
  return;


PHP 5.35, xml_parse function, i parsed 9.2MB xml file to sql, script in place 1 do it at 11.54s (do more than only condition)
up
-55
Anonymous
9 months ago
The word 'elseif' is a not a combination of "if and else," but a combination of "else and if."
up
-76
Rudi
4 years ago
Note that } elseif() { is somewhat faster than } else if() {

===================================
Test (100,000,000 runs):
<?php
$start
= microtime(true);
for(
$i = 0; $i < 100000000; $i++) {
    if(
2 === 0) {} else if(2 === 1) {} else {}
}
$end = microtime(true);
echo
"1: ".($end - $start)."\n";
unset(
$start, $end);

$start = microtime(true);
for(
$i = 0; $i < 100000000; $i++) {
    if(
2 === 0) {} elseif(2 === 1) {} else {}
}
$end = microtime(true);
echo
"2: ".($end - $start);
?>

===================================
Result (depending on hardware configuration):
1: 20.026723146439
2: 20.20437502861
To Top