Fehlende {
oder }
falsche Einrückung
Nicht übereinstimmende Codeklammern treten häufig bei weniger gut formatiertem Code auf, z.
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Wenn Ihr Code so aussieht, beginnen Sie neu! Andernfalls kann es weder für Sie noch für andere Personen behoben werden. Es macht keinen Sinn, dies im Internet zu präsentieren, um um Hilfe zu bitten.
Sie können das Problem nur beheben, wenn Sie die verschachtelte Struktur und Beziehung der if / else-Bedingungen und ihrer {
Codeblöcke visuell verfolgen können }
. Verwenden Sie Ihre IDE, um festzustellen, ob alle gepaart sind.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Jedes Double }
}
schließt nicht nur einen Zweig, sondern eine vorherige Bedingungsstruktur. Halten Sie sich daher an einen Codierungsstil. Nicht in verschachtelten if / else-Bäumen mischen und anpassen.
Abgesehen von der Konsistenz erweist es sich hier als hilfreich, auch langwierige Bedingungen zu vermeiden. Verwenden Sie temporäre Variablen oder Funktionen, um unlesbare if
Ausdrücke zu vermeiden .
IF
kann nicht in Ausdrücken verwendet werden
Ein überraschend häufiger Fehler eines Neulings ist der Versuch, eine if
Anweisung in einem Ausdruck zu verwenden, z. B. eine print-Anweisung:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Welches ist natürlich ungültig.
Sie können eine ternäre Bedingung verwenden , achten Sie jedoch auf die Auswirkungen auf die Lesbarkeit.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Andernfalls brechen Sie solche Ausgabekonstrukte auf: Verwenden Sie mehrere if
s und echo
s .
Besser noch, verwenden Sie temporäre Variablen und stellen Sie Ihre Bedingungen vor:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
Das Definieren von Funktionen oder Methoden für solche Fälle ist oft auch sinnvoll.
Steuerblöcke geben keine "Ergebnisse" zurück
Dies ist zwar weniger häufig, aber einige Programmierer versuchen sogar, so zu behandeln, if
als ob ein Ergebnis zurückgegeben werden könnte :
$var = if ($x == $y) { "true" };
Dies ist strukturell identisch mit der Verwendung if
innerhalb einer Zeichenfolgenverkettung / eines Ausdrucks.
- Aber Kontrollstrukturen (wenn / foreach / while) nicht über ein „Ergebnis“ .
- Die wörtliche Zeichenfolge "true" wäre auch nur eine nichtige Aussage.
Sie müssen eine Zuordnung im Codeblock verwenden :
if ($x == $y) { $var = "true"; }
Alternativ können Sie auf einen ?:
ternären Vergleich zurückgreifen .
Wenn in Wenn
Sie können auch keineif
innerhalb einer Bedingung verschachteln :
⇓
if ($x == true and (if $y != false)) { ... }
Was offensichtlich überflüssig ist, weil das and
(oder or
) bereits Verkettungsvergleiche erlaubt.
Vergessene ;
Semikolons
Noch einmal: Jeder Steuerblock muss eine Anweisung sein. Wenn das vorherige Codeteil nicht durch ein Semikolon abgeschlossen wird, ist dies ein garantierter Syntaxfehler:
⇓
$var = 1 + 2 + 3
if (true) { … }
Übrigens benötigt die letzte Zeile in einem {…}
Codeblock auch ein Semikolon.
Semikolon zu früh
Jetzt ist es wahrscheinlich falsch, einen bestimmten Codierungsstil zu beschuldigen, da diese Falle zu leicht zu übersehen ist:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Was öfter passiert, als Sie sich vorstellen können.
- Wenn Sie den
if ()
Ausdruck;
damit beenden , wird eine void-Anweisung ausgeführt. Das ;
wird ein {}
Eigenes!
- Der
{…}
Block ist somit vom gelöst if
und würde immer laufen.
- Das hatte also
else
keine Beziehung mehr zu einem offenen if
Konstrukt, weshalb dies zu einem unerwarteten T_ELSE-Syntaxfehler führen würde.
Dies erklärt auch eine ebenfalls subtile Variation dieses Syntaxfehlers:
if ($x) { x_is_true(); }; else { something_else(); };
Wobei der ;
Codeblock nach dem Code {…}
das gesamte if
Konstrukt beendet und den else
Zweig syntaktisch trennt .
Keine Codeblöcke verwenden
Es ist syntaktisch erlaubt, geschweifte Klammern wegzulassen {
… }
für Codeblöcke in if
/ elseif
/ else
Zweigen. Was leider ein Syntaxstil ist, der bei nicht versierten Codierern sehr verbreitet ist. (Unter der falschen Annahme war dies schneller zu tippen oder zu lesen).
Es ist jedoch sehr wahrscheinlich, dass dies die Syntax beeinträchtigt. Früher oder später finden zusätzliche Anweisungen Eingang in die if / else-Zweige:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Aber tatsächlich Codeblöcke verwenden zu können, müssen zu schreiben {
... }
sie als solche!
Selbst erfahrene Programmierer vermeiden diese spannungslose Syntax oder verstehen sie zumindest als außergewöhnliche Ausnahme von der Regel.
Sonst / Elseif in falscher Reihenfolge
Eine Sache, an die Sie sich erinnern sollten, ist natürlich die bedingte Reihenfolge .
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Sie können so viele elseif
s haben, wie Sie möchten, müssen aber else
zuletzt gehen . Ist einfach so.
Klassenerklärungen
Wie oben erwähnt , können Sie in einer Klassendeklaration keine Steueranweisungen haben:
class xyz {
if (true) {
function ($var) {}
}
Sie haben entweder eine Funktionsdefinition vergessen oder }
in solchen Fällen eine zu früh geschlossen .
Unerwartetes T_ELSEIF / T_ELSE
Beim Mischen von PHP und HTML muss sich das Schließen }
für a if/elseif
im selben PHP-Block <?php ?>
wie das nächste befinden elseif/else
. Dies führt zu einem Fehler, da das Schließen }
für die if
Anforderungen Teil von elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
Die richtige Form <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Dies ist mehr oder weniger eine Variation falscher Einrückungen - vermutlich oft aufgrund falscher Codierungsabsichten.
Sie können keine anderen Anweisungen zwischen if
und elseif
/ oder else
strukturellen Token mischen:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
Beides kann nur in {…}
Codeblöcken auftreten, nicht zwischen Kontrollstruktur-Token.
- Das würde sowieso keinen Sinn ergeben. Es ist nicht so, dass es einen "undefinierten" Zustand gab, wenn PHP zwischen
if
und else
Zweigen springt .
- Sie müssen sich entscheiden, wo Druckanweisungen zu / gehören oder ob sie in beiden Zweigen wiederholt werden müssen.
Sie können ein if / else auch nicht zwischen verschiedenen Kontrollstrukturen trennen:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
Es gibt keine syntaktische Beziehung zwischen if
und else
. Der foreach
lexikalische Bereich endet bei }
, sodass es keinen Sinn macht, die if
Struktur fortzusetzen.
T_ENDIF
Wenn ein unerwartetes T_ENDIF beanstandet wird, verwenden Sie den alternativen Syntaxstil if:
⋯ elseif:
⋯ else:
⋯ endif;
. Worüber Sie wirklich zweimal nachdenken sollten.
Eine häufige Gefahr besteht darin, den unheimlich ähnlichen :
Doppelpunkt mit einem ;
Semikolon zu verwechseln . (In "Semikolon zu früh" behandelt)
Da Einrückungen in Vorlagendateien schwieriger zu verfolgen sind, gilt dies umso mehr, wenn Sie die alternative Syntax verwenden. Es ist plausibel, dass Sie mit endif;
keiner übereinstimmen if:
.
Die Verwendung } endif;
ist ein Doppelterminator if
.
Während ein "unerwartetes $ Ende" normalerweise der Preis für eine vergessene schließende }
geschweifte Klammer ist.
Zuordnung vs. Vergleich
Dies ist also kein Syntaxfehler, aber in diesem Zusammenhang erwähnenswert:
⇓
if ($x = true) { }
else { do_false(); }
Das ist kein ==
/ ===
Vergleich, sondern eine =
Aufgabe . Dies ist ziemlich subtil und führt einige Benutzer leicht dazu, ganze Bedingungsblöcke hilflos zu bearbeiten. Achten Sie zuerst auf unbeabsichtigte Aufgaben - wenn Sie einen logischen Fehler / ein falsches Verhalten feststellen.