Unterschied zwischen if () {} und if (): endif;

158

Gibt es Unterschiede zwischen ...

if ($value) {

}

...und...

if ($value):

endif;

?

Alex
quelle
Der zweite Weg ist seit PHP4 da, wenn nicht früher.
Meilen
1
Die meisten Antworten sprechen nicht wirklich den Hauptpunkt an : Was funktioniert besser, wenn Sie sich Code ansehen und es gibt viele Schließbefehle wie } } } }(was endifauch möglich ist) und Sie möchten wissen, wo sie geöffnet waren? Die Antwort ist weder . Es ist im Grunde die erste "Regel" der Python-Design-Prinzipien .
Cregox
7
Offensichtlich {}ist es besser und : endif;eine Gräueltat, die es nicht geben würde, wenn das Leben fair wäre. Mit einem guten Texteditor haben Sie eine Tastenkombination für passende Klammern, um von der Öffnung zum Schließen oder umgekehrt zu springen. Für die abscheuliche : endif;Syntax gibt es so etwas noch nie .
Entwicklerwjk
3
@developerwjk wie könnte das nie existieren?
alex

Antworten:

176

Sie sind die gleichen, aber die zweite ist großartig, wenn Sie MVC in Ihrem Code haben und nicht viele Echos in Ihrem Code haben möchten. Zum Beispiel .phtmlschreibe ich in meine Dateien (Zend Framework) so etwas:

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>
Thomaschaaf
quelle
38
@alex Es wird auch mit geschweiften Klammern funktionieren, aber zumindest persönlich finde ich diesen Weg in solchen Dingen klarer. Weil sie wissen, dass es das Ende eines Wenn und nicht das Ende einer Schleife oder etwas anderem ist. Denken Sie, Sie haben endfor und endwhile oder etwas Ähnliches auch.
Svish
10
Ich würde das <? =?> Nicht verwenden, da es nicht auf allen Servern unterstützt wird, insbesondere auf Shared Hosting-Servern, bei denen Sie die php.ini nicht ändern können.
Siqi Lin
2
Der relevante Punkt ist <? Php endif; ?> - Sie können genau sagen, was auch mit vielen HTML-Zeilen zwischen dem vorhergehenden if / else und dieser Anweisung endet.
Fenton
7
Warum "ist der zweite großartig, wenn Sie nicht viele Echos in Ihrem Code haben möchten"? Ich denke, das gilt auch für die traditionelle Syntax {}. Es wird kein zusätzliches Echo benötigt <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Was ist der Unterschied zu <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu
9
Ich bin mir nicht sicher, warum diese Antwort die höchste ist, da sie kein gutes Beispiel ist (genau das können Sie mit geschweiften Klammern erreichen).
Reinier Kaper
69

Ich persönlich hasse die alternative Syntax wirklich. Eine schöne Sache an den Klammern ist, dass die meisten IDEs, Vim usw. Klammer-Hervorhebungen haben. In meinem Texteditor kann ich auf eine Klammer doppelklicken und sie hebt den gesamten Block hervor, sodass ich sehr leicht sehen kann, wo er endet und beginnt.

Ich kenne keinen einzigen Editor, der Endif, Endforeach usw. hervorheben kann.

dprevite
quelle
11
Dies soll in PHP-Vorlagen verwendet werden, bei denen Anfang und Ende des Blocks durch einen Teil der Fremdsprache getrennt sind. Wenn Ihre IDE PHP gut genug versteht, um dies zu analysieren, sollte sie auch endifals Blockende richtig hervorgehoben werden. Wenn dies nicht der Fall ist, kaufen Sie nichts, indem Sie es verwenden, }da es sowieso nicht passt .
Pavel Minaev
2
Die meisten Ideen (zumindest die, die ich verwendet habe) markieren nur {}
AntonioCS
11
Netbeans 7.x hebt glücklich passende Endforeach, Endif usw. hervor
Jonathan Day
@Herr. Minaev: Der Klammer-Matcher wird wahrscheinlich in 98% der Fälle korrekt analysiert, selbst wenn sich darin Fremdcode befindet. Es wird nur fehlschlagen, wenn eine ezoterische Klammer "Öffnen, aber kein Schließen von Code" darin enthalten ist. Ja, es passiert, aber es kommt nur selten vor. Warum denkst du, dass ein komplexes "Ende-was auch immer"; Parser-Ansatz wird praktisch besser als die einfache Lösung?
PatlaDJ
Ich denke , der wichtigste Punkt ist beschreibend , wenn nötig. So können wir leicht herausfinden, wo es geöffnet war, unabhängig davon, welches Tool wir verwenden müssen. Dies gilt insbesondere für PHP, das Sie von Zeit zu Zeit mit den einfachsten Editoren sehen müssen.
Cregox
49

Ich denke, das sagt alles:

Diese alternative Syntax eignet sich hervorragend zur Verbesserung der Lesbarkeit (sowohl für PHP als auch für HTML!) in Situationen, in denen Sie eine Mischung aus diesen haben.

http://ca3.php.net/manual/en/control-structures.alternative-syntax.php

Beim Mischen von HTML und PHP ist die Alternative sytnax viel einfacher zu lesen. In normalen PHP-Dokumenten sollte die traditionelle Syntax verwendet werden.


quelle
7
+1, Schöne Antwort auf den Zweck. Persönlich denke ich, dass es eine sinnlose Ergänzung zu einer bereits überfüllten Sprache ist.
Draemon
29

In unserem Unternehmen ist der bevorzugte Umgang mit HTML:

<? if($condition) { ?>
   HTML content here
<? } else { ?>
   Other HTML content here
<? } ?>

Am Ende geht es wirklich darum, einen auszuwählen und dabei zu bleiben.

gahooa
quelle
Danke - ich habe diese Antwort aktualisiert. Es schlägt ein wenig um den heißen Brei herum, kann aber helfen.
Gahooa
Wen meinst du, wenn du "unser" sagst?
Oddthinking
+1 zur Vermeidung übermäßiger Echoanweisungen und Anführungszeichen. :)
John McCollum
<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
FEHLER
13

Sie sind in der Tat beide funktionell gleich.

Aber wenn das endifzu weit vom Korrespondenten entfernt ist, ist es ifmeiner Meinung nach viel besser, einen referenzierenden Kommentar dazu abzugeben. Nur damit Sie leicht finden können, wo es geöffnet war. Egal welche Sprache es ist:

if (my_horn_is_red or her_umbrella_is_yellow)
{

    // ...

    // let's pretend this is a lot of code in the middle

    foreach (day in week) {
        sing(a_different_song[day]);
    }

    // ...

} //if my_horn_is_red

Das gilt eigentlich für jede analoge "Schlusssache"! ;)

Außerdem gehen Redakteure im Allgemeinen besser mit geschweiften Klammern um, in dem Sinne, dass sie Sie darauf hinweisen können, wo sie geöffnet waren. Aber selbst das macht die beschreibenden Kommentare nicht weniger gültig.

Cregox
quelle
1
Stimmen Sie zu, dass dies viel besser ist - anstatt endif auszutippen - können Sie sagen, was die if-Bedingung tatsächlich tut.
Cartalot
@cartalot vielleicht wäre es sogar schön, die Sprache eingebaut zu haben (als optionales schließendes Argument für benannte Blöcke), sodass wir Fehler beim Schließen falscher Blöcke an falschen Stellen haben könnten! :)
Cregox
9

Ich denke, dass es besonders klarer ist, wenn Sie eine Mischung aus ifs, fors und foreaches in Ansichtsskripten verwenden:

<?php if ( $this->hasIterable ): ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ):?>
        <?php for ( $i = 0; $i <= $val; $i++ ): ?>
        <li><?php echo $key ?></li>
        <?php endfor; ?>
    <?php endforeach; ?>
    </ul>
<?php elseif ( $this->hasScalar ): ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ): ?>
    <p>Foo = Bar</p>
    <?php endfor; ?>
<?php else: ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ): ?>
    <p>Spam</p>
    <?php else: ?>  
    <p>Eggs</p>  
    <?php endif; ?>
<?php endif; ?>

im Gegensatz zu:

<?php if ( $this->hasIterable ){ ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ){?>
        <?php for ( $i = 0; $i <= $val; $i++ ){ ?>
        <li><?php echo $key ?></li>
        <?php } ?>
    <?php } ?>
    </ul>
<?php } elseif ( $this->hasScalar ){ ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ){ ?>
    <p>Foo = Bar</p>
    <?php } ?>
<?php } else { ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ){ ?>
    <p>Spam</p>
    <?php } else { ?>  
    <p>Eggs</p>  
    <?php } ?>
<?php } ?>

Dies ist besonders nützlich für lange Steueranweisungen, bei denen die obere Deklaration möglicherweise nicht in der unteren Klammer angezeigt wird.

Harry Mustoe-Playfair
quelle
7

Ich denke, dass es wirklich von Ihrem persönlichen Codierungsstil abhängt. Wenn Sie an C ++, Javascript usw. gewöhnt sind, fühlen Sie sich mit der Syntax {} möglicherweise wohler. Wenn Sie an Visual Basic gewöhnt sind, möchten Sie möglicherweise Folgendes verwenden: endif; Syntax.

Ich bin mir nicht sicher, ob man definitiv sagen kann, dass einer leichter zu lesen ist als der andere - es ist eine persönliche Präferenz. Normalerweise mache ich so etwas:

<?php
if ($foo) { ?>
   <p>Foo!</p><?php
} else { ?>
   <p>Bar!</p><?php
}  // if-else ($foo) ?>

Ob das leichter zu lesen ist als:

<?php
if ($foo): ?>
   <p>Foo!</p><?php
else: ?>
   <p>Bar!</p><?php
endif; ?>

ist Ansichtssache. Ich kann sehen, warum manche meinen, der zweite Weg sei einfacher - aber nur, wenn Sie Ihr ganzes Leben lang nicht in Javascript und C ++ programmiert haben. :) :)

livefree75
quelle
1
Nein, die Klammern sind objektiv leichter zu lesen (wenn Sie nicht die ägyptische Version verwenden). Selbst wenn Sie die Klammern so ausführen, dass sie wie ein Ägypter laufen, ist sie leichter zu lesen als die VB-Syntax, da moderne Texteditoren über eine Klammeranpassungsfunktion verfügen, mit der Sie vom Öffnen zum Schließen der Klammer oder umgekehrt gelangen. Es gibt keine Möglichkeit, eine VB-Syntaxanpassungsfunktion zu haben. Außerdem müssen Sie die Verschachtelung berücksichtigen, und VB scheitert daran kläglich.
Entwicklerwjk
5

Ich würde die erste Option verwenden, wenn dies überhaupt möglich ist, unabhängig von der neuen Option. Die Syntax ist Standard und jeder weiß es. Es ist auch abwärtskompatibel.

Paulo
quelle
5

Beide sind gleich.

Aber: Wenn Sie PHP als Vorlagensprache in Ihren Ansichtsdateien verwenden möchten (das V von MVC), können Sie diese alternative Syntax verwenden, um zwischen PHP-Code zu unterscheiden, der zur Implementierung von Geschäftslogik (Controller- und Model-Teile von MVC) geschrieben wurde, und Gui- Logik. Natürlich ist es nicht obligatorisch und Sie können jede beliebige Syntax verwenden.

ZF verwendet diesen Ansatz.

Itay Moav-Malimovka
quelle
5

Es gibt keinen technischen Unterschied zwischen den beiden Syntaxen. Die alternative Syntax ist nicht neu. Es wurde mindestens schon in PHP 4 und vielleicht sogar schon früher unterstützt.

Möglicherweise bevorzugen Sie das alternative Formular, da es explizit angibt, welche Kontrollstruktur endet: endwhileBeispielsweise kann nur ein whileBlock beendet werden , während bei einer Klammer alles geschlossen werden kann.

Möglicherweise bevorzugen Sie jedoch die herkömmliche Syntax, wenn Sie einen Editor verwenden, der geschweifte Klammern in anderen C-ähnlichen Syntaxen unterstützt. Vim unterstützt beispielsweise mehrere Tastenanschläge, um zu passenden Klammern und zu den Anfangs- und Endpunkten von durch Klammern getrennten Blöcken zu navigieren. Die alternative Syntax würde diese Editorfunktion beschädigen.

Rob Kennedy
quelle
3

Am Ende möchten Sie einfach nicht nach der folgenden Zeile suchen und dann raten müssen, wo sie begonnen hat:

<?php } ?>

Technisch und funktional sind sie gleich.

Bondt
quelle
1
Ein guter Texteditor verfügt über eine Verknüpfung in Klammern, mit der Sie dorthin gelangen, wo er begonnen hat. Es endif;wird schwierig sein, den Anfang dafür zu finden, da sie dafür keine ähnliche Funktion haben und der Code im VB-Stil nicht gut verschachtelt ist.
Entwicklerwjk
3

Es hängt alles davon ab, ich persönlich bevorzuge die traditionelle Syntax mit Echos und vielen Einrückungen, da sie einfach viel einfacher zu lesen ist.

<?php
    if($something){
        doThis();
    }else{
        echo '<h1>Title</h1>
            <p>This is a paragraph</p>
            <p>and another paragraph</p>';
    }
?>

Ich bin damit einverstanden, dass die Alt-Syntax mit den verschiedenen Endklauseln sauberer ist, aber es fällt mir wirklich schwer, ohne Hilfe der Texteditor-Hervorhebung mit ihnen umzugehen, und ich bin es einfach nicht gewohnt, "komprimierten" Code wie diesen zu sehen:

<?php if( $this->isEnabledViewSwitcher() ): ?>
<p class="view-mode">
    <?php $_modes = $this->getModes(); ?>
    <?php if($_modes && count($_modes)>1): ?>
    <label><?php echo $this->__('View as') ?>:</label>
    <?php foreach ($this->getModes() as $_code=>$_label): ?>
        <?php if($this->isModeActive($_code)): ?>
            <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp;
        <?php else: ?>
            <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>&nbsp;
        <?php endif; ?>
    <?php endforeach; ?>
    <?php endif; ?>
</p>
<?php endif; ?>
Yi Yang
quelle
2

Früher habe ich geschweifte Klammern verwendet, heute bevorzuge ich diese alternative Syntax für kurze Hand, da der Code lesbar und zugänglich ist.


quelle
Ich verwende es in meinen Ansichtsvorlagen.
Alex
2

Persönlich bevorzuge ich es, es in zwei getrennten Abschnitten zu machen, aber innerhalb des gleichen PHP wie:

<?php 
    if (question1) { $variable_1 = somehtml; }
    else { $variable_1 = someotherhtml; } 

    if (question2) {
        $variable_2 = somehtml2;
    }

    else { 
        $variable_2 = someotherhtml2;
    }         

etc.
$output=<<<HERE
htmlhtmlhtml$variable1htmlhtmlhtml$varianble2htmletcetcetc
HERE;
echo $output;

?>

Aber vielleicht ist es langsamer?

Henrik
quelle
1

Ich denke, es ist eine Frage der Präferenz. Ich persönlich benutze:

if($something){
       $execute_something;
}
Sergio Rodriguez
quelle
1
Wenn Sie den gesamten Thread lesen würden: Alternative Syntax wird bevorzugt und viel <em> sauberer </ em> beim Vorlagen oder Verwenden von Fremdsprachen in PHP-Ansichten
Juraj Blahunka
1

Ich habe geschweifte Klammern für "if, else" -Bedingungen verwendet. Ich fand jedoch "if (xxx): endif;" ist semantischer, wenn der Code stark umbrochen ist und in Editoren leichter zu lesen ist.

Natürlich können viele Editoren Codeblöcke erkennen und hervorheben, wenn geschweifte Klammern ausgewählt werden. Einige eignen sich auch gut für das Paar "if (xxx): endif" (z. B. NetBeans).

Persönlich würde ich "if (xxx): endif" empfehlen, aber für kleine Zustandsprüfungen (z. B. nur eine Codezeile) gibt es keine großen Unterschiede.

Aaron Chen
quelle
1

Ich habe das Gefühl, dass keine der bereits vorhandenen Antworten die Antwort hier vollständig identifiziert, daher werde ich meine eigene Perspektive artikulieren. Funktionell sind die beiden Methoden gleich. Wenn der Programmierer mit anderen Sprachen vertraut ist, die der C-Syntax folgen, fühlen sie sich wahrscheinlich mit den Klammern wohler, oder wenn PHP die erste Sprache ist, die sie lernen, fühlen sie sich mit der if endifSyntax wohler , da sie näher zu sein scheint zur regulären Sprache.

Wenn Sie ein wirklich ernsthafter Programmierer sind und die Dinge schnell erledigen müssen, dann glaube ich, dass die Syntax der geschweiften Klammern überlegen ist, weil sie Zeit beim Tippen spart

if(/*condition*/){
    /*body*/ 
}

verglichen mit

if(/*condition*/):
    /*body*/
endif;

Dies gilt insbesondere für andere Schleifen, z. B. foreachwenn Sie am Ende zusätzliche 10 Zeichen eingeben würden. Bei geschweiften Klammern müssen Sie nur zwei Zeichen eingeben, aber für die schlüsselwortbasierte Syntax müssen Sie für jede Schleife und bedingte Anweisung ein ganz zusätzliches Schlüsselwort eingeben.

Andrew
quelle