Paul: Unterschied elseif und else if

Moin.
Gibt es in PHP einen Unterschied zwischen elseif und else if?

Beispiel:
if(a) echo 'test';
else if (b) echo 'test2';

if(a) echo 'test';
elseif (b) echo 'test2';

Evtl. sind im ersten Beispiel zwei Verzweigungen vorhanden (if und wenn nicht else und wenn else true ist dann noch ein if) und beim zweiten nur eine (if und wenn nicht elseif)?

Paul

  1. Hi,

    Gibt es in PHP einen Unterschied zwischen elseif und else if?

    http://www.php.net/manual/en/control-structures.elseif.php

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Beispiel:
    if(a) echo 'test';
    else if (b) echo 'test2';

    if(a) echo 'test';
    elseif (b) echo 'test2';

    Evtl. sind im ersten Beispiel zwei Verzweigungen vorhanden (if und wenn nicht else und wenn else true ist dann noch ein if) und beim zweiten nur eine (if und wenn nicht elseif)?

    Aber den Untnerschied den die PHP-Doku nicht erklärt, erklärst du wieder nicht :)

    Das Ergebnis ist dasselbe - das Parsingverhalten ist aber, wenn ich jetzt nicht falsch liegen etwa so: Spricht das eine (elseif) geht sequentiell durch und steigt da aus, wo die Bedingung zutrifft (wie eine switch-Verzweigung mit break drin) und die andere Variante (else if) verhält sich wie ein verschachtelter if-else-Zweig.

    if($i = 0) {  
    } elseif (i = 1) {  
    } elseif (i = 2) {  
    } else {  
    }
    

    entspricht logisch etwa diesem:

    switch($i) {  
      case 0:  
        break;  
      case 1:  
        break;  
      case 2:  
        break;  
      default:  
    }
    
    if($i = 0) {  
    } else if (i = 1) {  
    } else if (i = 2) {  
    } else {  
    }
    

    entspricht / bzw. ist eine kompaktere schreibweise für:

    if($i = 0) {  
    } else {  
      if($i = 1) {  
      } else {  
        if($i = 2) {  
        } else {  
        }  
      }  
    }
    
    1. Nachtrag - das sollte eine Antwort auf ChrisB sein.

    2. Hi!

      Das Ergebnis ist dasselbe - das Parsingverhalten ist aber, wenn ich jetzt nicht falsch liegen etwa so: Spricht das eine (elseif) geht sequentiell durch und steigt da aus, wo die Bedingung zutrifft (wie eine switch-Verzweigung mit break drin) und die andere Variante (else if) verhält sich wie ein verschachtelter if-else-Zweig.

      Auch das verschachtelte if-else-Konstrukt "geht sequenziell durch und steigt da aus, wo die Bedingung zutrifft". Es gibt in der Wirkungsweise keinen Unterschied. Der Vergleich mit switch hinkt zudem noch ziemlich. Switch vergleicht immer den selben Wert mit den case-Ausdrücken, verschachtelte if-elses in beiden Schreibweisen können Bedingungen unabhängig voneinander auswerten.

      Lo!

      1. Auch das verschachtelte if-else-Konstrukt "geht sequenziell durch und steigt da aus, wo die Bedingung zutrifft". Es gibt in der Wirkungsweise keinen Unterschied. Der Vergleich mit switch hinkt zudem noch ziemlich. Switch vergleicht immer den selben Wert mit den case-Ausdrücken, verschachtelte if-elses in beiden Schreibweisen können Bedingungen unabhängig voneinander auswerten.

        Aber was ist dann der Unterschied - ich kapiers nicht ;)

        Kannst du mir das bitte anhand einer Sprache die beides nicht kann (z.B. VBS oder C#) erklären?

        1. Aber was ist dann der Unterschied

          Keiner, wenn du den Anweisungsblock mit geschweiften Klammern umschließt (was man üblicherweise tut).

          Es ist mehr ein syntaktischer Unterschied. Bei dem einen verschachtelst du if-else-Statements ineinander, bei if-elseif hat das eine if-Statement noch weitere elseif-Teile.

          Mathias

          1. Aber was ist dann der Unterschied

            Keiner, wenn du den Anweisungsblock mit geschweiften Klammern umschließt (was man üblicherweise tut).

            Dass logisch kein Unterschied besteht ist mir klar,

            Es ist mehr ein syntaktischer Unterschied.

            Ja schon klar :)

            Bei dem einen verschachtelst du if-else-Statements ineinander, bei if-elseif hat das eine if-Statement noch weitere elseif-Teile.

            Aber es lässt sich das eine jeweils als das andere schreiben und umgekehrt und man kommt zu demselben Erbebnis.

            Was die PHP-Doku mit "if you're familiar with C, this is the same behavior" interessiert mich :) ich bin nicht vertraut mit C, lediglich mit VBSscript und sehr grundlegend mit C# - und in beiden Fällen gibts so ein Konstruktur nicht. Da muss man ohnehin mit verschachtelten if/else -> if/else/end if-Würsten herumbauen.

          2. Hi!

            Aber was ist dann der Unterschied
            Keiner, wenn du den Anweisungsblock mit geschweiften Klammern umschließt (was man üblicherweise tut).

            Der Punkt ist nicht die Klammerei sondern normale vs. alternative Syntax (die mit dem Doppelpunkt und endif).

            Lo!

            1. Der Punkt ist nicht die Klammerei sondern normale vs. alternative Syntax (die mit dem Doppelpunkt und endif).

              Ja, das meinte ich, das ist ja die übliche Schreibweise
              Wenn der Anweisungsblock nur eine Anweisung enthält, sind die Klammern natürlich unnötig.

              if ($foo)              if ($foo)
                 func1();               func1();
              elseif ($bar)          else if ($bar)
                 func2();               func2();

              if ($foo) {            if ($foo)
                 func1();               func1();
              } elseif ($bar) {      elseif ($bar)
                 func2();               func2();
              }

              Same-same.

              Gibt es eigentlich Coding-Guidelines, die die Doppelpunkte vorschreiben? Ich sehe das öfters in Templates, aber ich mache insgesamt nicht viel PHP.

              Mathias

              1. Hi!

                Gibt es eigentlich Coding-Guidelines, die die Doppelpunkte vorschreiben? Ich sehe das öfters in Templates, aber ich mache insgesamt nicht viel PHP.

                In Templates sind die ja auch einigermaßen praktisch, in "normalem" Code wohl eher nicht. Ich hab das auch noch nirgendwo anders als in Templates gesehen, geschweige denn in Coding-Guidelines.

                Lo!

              2. Hi molily.

                Wenn der Anweisungsblock nur eine Anweisung enthält, sind die Klammern natürlich unnötig.

                Was genau der Grund ist, warum es das "else if" ueberhaupt gibt: Der else-Block enthaelt nur eine Anweisung (bzw. einen Block), naemlich das if-Statement. Daher sind Klammern um das if-Statement unnoetig. Mehr steckt nicht dahinter, das "else" und das "if" haben nichts miteinander zu tun.

                Viele Grüße,
                der Bademeister

        2. Hi!

          Aber was ist dann der Unterschied - ich kapiers nicht ;)

          Steht doch auf der Handbuchseite: es gibt effektiv keinen Unterschied. Man kann das schreiben wie man will. Lediglich die alternative Syntax lässt keine Getrennt-Schreibweise zu.

          Lo!

          1. Hi dedlfix.

            Lediglich die alternative Syntax lässt keine Getrennt-Schreibweise zu.

            Das ist *so* auch irrefuehrend bis falsch. "else if" ist kein eigenes 'Sprachfeature' (anders als "elseif"), sondern lediglich der Gebrauch eines "if"-Statements innerhalb eines "else"-Blocks. Das ist natuerlich auch in der alternativen Syntax erlaubt. Allerdings muss dann natuerlich trotzdem - wie immer bei dieser Syntax - ein Doppelpunkt hinter dem "else" stehen.

            Viele Grüße,
            der Bademeister