Manquant {
ou }
dû à une indentation incorrecte
Les accolades de code incompatibles sont communes aux codes moins bien formatés tels que:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Si votre code ressemble à ceci, recommencez! Sinon, cela ne peut pas être résolu pour vous ou quelqu'un d'autre. Il est inutile de présenter cela sur Internet pour demander de l'aide.
Vous ne pourrez y remédier que si vous pouvez suivre visuellement la structure et la relation imbriquées des conditionnelles if / else et de leurs {
blocs de code }
. Utilisez votre IDE pour voir s'ils sont tous appariés.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Tout double }
}
ne fermera pas seulement une branche, mais une structure de condition précédente. Par conséquent, respectez un seul style de codage; ne pas mélanger et assortir dans les arbres imbriqués if / else.
En dehors de la cohérence ici, il s'avère utile d'éviter également les longues conditions. Utilisez des variables ou des fonctions temporaires pour éviter les if
expressions illisibles .
IF
ne peut pas être utilisé dans les expressions
Une erreur de nouveau venu étonnamment fréquente essaie d'utiliser une if
déclaration dans une expression, telle qu'une déclaration imprimée:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Ce qui n'est pas valable bien sûr.
Vous pouvez utiliser un conditionnel ternaire , mais méfiez-vous des impacts sur la lisibilité.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Sinon, cassez ces constructions de sortie: utilisez plusieurs if
s et echo
s .
Mieux encore, utilisez des variables temporaires et placez vos conditionnelles avant:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
La définition de fonctions ou de méthodes pour de tels cas est également souvent logique.
Les blocs de contrôle ne renvoient pas de "résultats"
Maintenant, c'est moins courant, mais quelques codeurs essaient même de traiter if
comme si cela pouvait retourner un résultat :
$var = if ($x == $y) { "true" };
Ce qui est structurellement identique à l'utilisation if
dans une concaténation / expression de chaîne.
- Mais les structures de contrôle (si / foreach / while) n'ont pas de "résultat" .
- La chaîne littérale "true" ne serait également qu'une déclaration void.
Vous devrez utiliser une affectation dans le bloc de code :
if ($x == $y) { $var = "true"; }
Alternativement, recourir à une ?:
comparaison ternaire.
Si dans If
Vous ne pouvez pas non plus imbriquer uneif
condition dans une condition:
⇓
if ($x == true and (if $y != false)) { ... }
Ce qui est évidemment redondant, car le and
(ou or
) permet déjà de chaîner des comparaisons.
Points- ;
virgules oubliés
Encore une fois: chaque bloc de contrôle doit être une instruction. Si le morceau de code précédent n'est pas terminé par un point-virgule, c'est une erreur de syntaxe garantie:
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, la dernière ligne d'un {…}
bloc de code a également besoin d'un point-virgule.
Point-virgule trop tôt
Maintenant, il est probablement faux de blâmer un style de codage particulier, car cet écueil est trop facile à ignorer:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Ce qui se produit plus souvent que vous ne l'imaginez.
- Lorsque vous terminez l'
if ()
expression avec,;
elle exécutera une instruction void. Le ;
devient un vide en {}
soi!
- Le
{…}
bloc est ainsi détaché du if
, et fonctionnerait toujours.
- Donc, le
else
n'avait plus de relation avec une if
construction ouverte , c'est pourquoi cela conduirait à une erreur de syntaxe T_ELSE inattendue.
Ce qui explique également une variation également subtile de cette erreur de syntaxe:
if ($x) { x_is_true(); }; else { something_else(); };
Où ;
après le bloc de code {…}
termine la if
construction entière , coupant la else
branche syntaxiquement.
Ne pas utiliser de blocs de code
Il est syntaxiquement autorisé d'omettre les accolades {
… }
pour les blocs de code dans if
/ elseif
/ else
branches. Ce qui est malheureusement un style de syntaxe très commun aux codeurs non inversés. (Sous l'hypothèse fausse, c'était plus rapide à taper ou à lire).
Cependant, cela est très susceptible de déclencher la syntaxe. Tôt ou tard, des instructions supplémentaires trouveront leur chemin dans les branches if / else:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Mais pour réellement utiliser des blocs de code, vous devez les écrire {
… }
tels quels!
Même les programmeurs chevronnés évitent cette syntaxe sans bretelles, ou du moins la comprennent comme une exception exceptionnelle à la règle.
Sinon / Elseif dans le mauvais ordre
Une chose à vous rappeler est bien sûr l' ordre conditionnel .
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Vous pouvez avoir autant de elseif
s que vous le souhaitez, mais cela else
doit durer . C'est comme ça.
Déclarations de classe
Comme mentionné ci-dessus , vous ne pouvez pas avoir d'instructions de contrôle dans une déclaration de classe:
class xyz {
if (true) {
function ($var) {}
}
Vous avez soit oublié une définition de fonction , soit fermé }
trop tôt dans de tels cas.
T_ELSEIF / T_ELSE inattendu
Lors du mélange de PHP et HTML, la fermeture }
d'un if/elseif
doit être dans le même bloc PHP <?php ?>
que le suivant elseif/else
. Cela générera une erreur car la fermeture }
des if
besoins doit faire partie de elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
La forme correcte <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Il s'agit plus ou moins d'une variation d'indentation incorrecte - vraisemblablement souvent basée sur de mauvaises intentions de codage.
Vous ne pouvez pas écraser d'autres instructions entre les jetons if
et elseif
/ else
structurels:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
L'un ou l'autre ne peut se produire que dans {…}
des blocs de code, pas entre des jetons de structure de contrôle.
- Cela n'aurait aucun sens de toute façon. Ce n'est pas comme s'il y avait un état "indéfini" lorsque PHP saute entre les branches
if
et else
.
- Vous devrez décider où les instructions d'impression appartiennent à / ou si elles doivent être répétées dans les deux branches.
Vous ne pouvez pas non plus séparer un if / else entre différentes structures de contrôle:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
Il n'y a pas de relation syntaxique entre le if
et else
. La foreach
portée lexicale se termine à }
, il n'y a donc aucun intérêt pour la if
structure de continuer.
T_ENDIF
Si un T_ENDIF inattendu est signalé, vous utilisez l'autre style de syntaxe if:
⋯ elseif:
⋯ else:
⋯ endif;
. Ce à quoi vous devriez vraiment réfléchir à deux fois.
Un piège commun confond le côlon étrangement similaire :
pour un ;
point - virgule . (Couvert dans "Point-virgule trop tôt")
Comme l'indentation est plus difficile à suivre dans les fichiers de modèle, plus lorsque vous utilisez la syntaxe alternative - il est plausible que votre endif;
ne corresponde à aucune if:
.
L'utilisation } endif;
est un double if
terminateur.
Alors qu'une "fin $ inattendue" est généralement le prix d'une }
accolade fermante oubliée .
Affectation vs comparaison
Donc, ce n'est pas une erreur de syntaxe, mais mérite d'être mentionnée dans ce contexte:
⇓
if ($x = true) { }
else { do_false(); }
Ce n'est pas une comparaison ==
/ ===
, mais une =
affectation . Ceci est plutôt subtil et conduira facilement certains utilisateurs à éditer en toute impuissance des blocs de condition entiers. Méfiez-vous d'abord des affectations involontaires - chaque fois que vous rencontrez un défaut / mauvais comportement logique.