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.
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.)
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.
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;
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
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.
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>
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.
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
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");
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>";
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
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;
?>
PHP Abkürzungsausdruck war seit PHP 5.3 verfügbar
$condition ? $value_if_true : $value_if_false
$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )