it-swarm.com.de

PHP - Wenn/sonst, für, während, ohne geschweifte Klammern?

Etwas, das Sie wirklich gerne wissen würden, aber nie herausgefunden haben, sind Abkürzungen in PHP.

Ich codiere derzeit eine Funktion mit einer foreach-Schleife, die nur eine einzige Anweisung enthält. Ich habe versucht, die geschweiften Klammern wegzulassen, wie Sie es in if/else-Kontrollstrukturen tun können, und es funktioniert. Keine Fehler.

foreach($var as $value)
    $arr[] = $value;

Jetzt habe ich versucht, es auf die gleiche Weise zu verwenden, aber einen if/else-Block hineinzulegen. Wieder funktioniert und keine Fehler.

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

Dann dachte ich mir "Warum funktioniert das?" und das schließende Semikolon weggelassen. Immer noch am arbeiten. Also habe ich versucht, die if/else -Anweisung ohne geschweifte Klammern in der foreach-Schleife zu verwenden, und funktioniert immer noch ohne Fehler. Aber ist die Foreach-Schleife jetzt wirklich geschlossen/beendet?

foreach($var as $value)
    if(1 + 1 == 2)
        $arr[] = $value;

Zumindest habe ich das schließende Semikolon wieder weggelassen, und (wie erwartet) ist ein Parsing-Fehler aufgetreten.

Meine große Frage ist also: Wann kann ich die geschweiften Klammern weglassen und in welcher Struktur/Schleife/Funktion? Ich weiß, dass ich dies definitiv in if und else tun kann. Aber was ist mit while, for und foreach?

Und ja, ich weiß, dass es nicht sicher, intelligent ist, was auch immer ohne geschweifte Klammern zu codieren, und es gibt Abkürzungen wie $condition ? true : false; und if: doSomething(); endif;, endfor; und endforeach;. Ich möchte nicht über Abkürzungen lernen. Ich möchte nur die Bedingungen verstehen, wann und wo es möglich ist, die geschweiften Klammern wegzulassen.

46
headacheCoder

Wenn Sie die geschweiften Klammern weglassen, wird nur die nächste Anweisung als Hauptteil der Bedingung behandelt.

if ($x) echo 'foo';

ist das gleiche wie

if ($x) { echo 'foo'; }

aber erinnere dich daran

if ($x)
  echo 'foo';
  echo 'bar';

wird immer "bar" drucken

Intern ist es umgekehrt: if betrachtet nur den nächsten Ausdruck, aber PHP behandelt alles in {} als einen einzigen "gruppierten" Ausdruck.

Gleiches für die anderen Steueranweisungen (foreach usw.)

77
KingCrunch

Es gibt Orte, wo Sie können, aber Sie sollten es niemals tun. 

Explizit ist immer besser als implizit. 

Wer weiß, wann Sie den alten Code ändern müssen. Es ist so leicht, das Zeug zu übersehen und es gibt nichts, was man daraus gewinnen kann. 

27
tkone

Es wird gut funktionieren, wenn Sie nur ein Argument in sich haben! Wenn Sie die geschweifte Klammer jedoch weglassen möchten, können Sie den Doppelpunkt und das Ende verwenden. Beispiel:

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;
10
site stats

Wie gesagt, Sie möchten nicht mehr über die Kurzschreibweise [] lernen und die akzeptierte Antwort gibt ein gutes Beispiel für das Weglassen von curly braces, aber es gibt noch etwas hinzuzufügen. Wie Sie sehen, ist es in Ordnung, curly braces im Falle von if ($x) echo 'foo'; wegzulassen. Es gibt nichts Falsches an Code, keine Leistung oder andere Probleme und es ist für andere Entwickler lesbar. Und das Beispiel zeigt Ihnen auch, wenn Sie schreiben

if ($x)
    echo 'foo';
    echo 'bar';

anstatt

if ($x)
    echo 'foo';

echo 'bar';

Sie können unerwünschte Ergebnisse erhalten, wenn bar gedruckt wird, während Sie nicht möchten, dass er gedruckt wird. Wenn Ihr Code mit solchen Anweisungen gefüllt ist, wird es für Sie schwieriger, Ihren eigenen Code zu lesen, und noch schwieriger für andere es.

Ich möchte nicht etwas über die Abkürzungen lernen. Ich möchte nur die Bedingungen verstehen, wann und wo es möglich ist, die geschweiften Klammern wegzulassen.

Diese Dinge sind eng miteinander verbunden. Wenn Sie also wirklich wissen wollen, wo es möglich ist, geschweifte Klammern wegzulassen, sollte dies ein Muss sein, das Sie verstanden haben oder zumindest von Kurzschreibern wissen, die Sie gelesen haben 

  1. PHP Kontrollstrukturen
  2. Die ternären PHP bedingten Operatoren und Ausdrücke im Allgemeinen

Meine große Frage ist also: Wann kann ich die geschweiften Klammern weglassen und in welcher Struktur/Schleife/Funktion?

Die geschweifte Klammer ist nicht erforderlich. Aus Gründen der Lesbarkeit und Wartung halten viele Entwickler es jedoch für ungünstig, sie nicht einzubeziehen. Die vorherigen 2 Links sollten Ihnen Informationen geben, die Sie benötigen, um Ihre eigenen Entscheidungen zu treffen, wenn Sie die geschweifte Klammer weglassen könnten. Zum Beispiel gibt es nichts Falsches an folgenden Codeausschnitten, die alle genau das Gleiche tun.

Mit geschweiften Klammern

if (PHP_VERSION_ID < 70000)
{
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
}

Ist gleich wie 

if (PHP_VERSION_ID < 70000) :
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
endif;

Oder Sie können den Punktoperator verwenden

if (PHP_VERSION_ID < 80000)
    (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

Und Sie können den ternären bedingten Operator verwenden und sogar if selbst weglassen, außer geschweifte Klammern.

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

Da wir nur drucken, können wir das abkürzen und einige print string functions entfernen, die hier mehr als eine Funktion in Anweisungen ohne geschweifte Klammern darstellen würden

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);

Ab php 7 können wir den Nullkoaleszenzoperator verwenden.

(PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1);

Wie man sehen kann, gibt es viele Möglichkeiten, genau dasselbe Ergebnis zu erzielen. Das gilt nicht nur für dieses if Beispiel, sondern kann auch mit structure/loop/function geübt werden. Es gibt also keine Antwort auf Ihre große Frage. Man sollte vor allem folgendes beachten.

  1. Ist der Code, den Sie schreiben, leicht zu pflegen?.
  2. Können Sie für sich selbst antworten, gibt es etwas, das Sie gewinnen, indem Sie geschweifte Klammern weglassen.
5
mkungla

Ich verwende geschweifte Klammern in meinen PHP - Vorlagen. Z.B. Sie können Schleifen wie folgt verwenden: 

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>
3
Georg Leber

Sie können es für einfache Dinge verwenden wie:

if($a === true) continue;

Bei einigen komplizierteren Bedingungen kann es jedoch zu Problemen kommen:

    $a = false;
    $b = false;
    if ($a === true)
        if ($b === true)
            echo 1;
    else
        echo 2;

Mit dem obigen Code würden Sie erwarten, dass "2" als Ausgabe angezeigt wird. Dies wird jedoch nicht der Fall sein.

2
Iliya Kolev

Für einzeilige Anweisungen.

Wenn du es versucht hast

foreach($array as $x => $y)
    $do_something = $x;
    $do_something_else = $y;

Wenn ich mich nicht irre, wird der PHP-Interpreter die zweite Zeile unter der Anweisung von foreach als außerhalb der implizierten Klammern halten

Aufgrund der Einrückung, wenn Sie zu einem späteren Zeitpunkt auf diesen Code zurückkamen oder ein anderer Entwickler sich Ihre Arbeit angesehen hat, wäre dies verwirrend.

Daher ist es generell ratsam, bei diesen Anweisungen immer geschweifte Klammern zu verwenden. Es wird später Kopfschmerzen/Verwirrung sparen

1
Pete Mitchell

Um die Antwort von @Marko zu ergänzen, sollten Sie beachten, dass Sie bei Verwendung des Punktoperators jeden Vorgang in Klammern angeben müssen, andernfalls wird die Reihenfolge umgekehrt.

Mit diesem Code wird beispielsweise PHP >= 7.0 required yours is 5.6.15 gedruckt.

(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");

Während dies 5.6.151PHP >= 7.0 required yours is 1 drucken wird.

print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n");

Sie können dazu auch den Operator and verwenden. So wie:

if (PHP_VERSION_ID < 70000)
    print("PHP >= 7.0 required yours is ") and
    print(phpversion()) and
    print("\n");
1
Renan Decarlo

Die Antwort ist einfach. Dies ist auch in C/C++ der Fall.

if, if/else, if/else if/else and loops => Wenn die nächste Anweisung eine Zeile ist, können Sie die geschweiften Klammern weglassen.

Ex:

for($i= 0; $i<=100; $i++)
{
    if($i % 7 == 0)
    {   
        echo $i . "<br>";
    }

}

Es kann auch so geschrieben werden:

for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";
0
AlexPac

Es ist möglich, wenn Sie nur einen Ausdruck nach Ihrer Klausel haben.

Zum Beispiel, 

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

ist richtig, aber

foreach($var as $value)
    $somevar = $var;
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

ist nicht, und PHP-Interpreter wird denken, dass if-Anweisung außerhalb von foreach

0
nikans

Wann kann ich die geschweiften Klammern weglassen und in welcher Struktur/Schleife/Funktion? Ich weiß, dass ich dies auf jeden Fall tun kann. Aber was ist mit während, für und für jeden?

Für If/else können single und multiple Anweisungen ohne geschweifte Klammern verwendet werden, indem das folgende Konstrukt verwendet wird:

<?php
  if ($x):
    echo 'foo';
    echo 'bar';
  else:
    echo 'nofoo';
    echo 'nobar';
  endif;
?>

Wie in diese Antwort beschrieben

Für while, for und foreach sind nur Einzelanweisungen ohne geschweifte Klammern zulässig

<?php
foreach($array as $x => $y)
    $do_something = $x;
?>
0
Duffmannen

PHP Abkürzungsausdruck war seit PHP 5.3 verfügbar

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
0
Midhun1993