Quelles sont les erreurs de syntaxe ?
PHP fait partie des Style C et impératif les langages de programmation. Il possède des règles de grammaire rigides, qu'il ne peut contourner lorsqu'il rencontre des symboles ou des identificateurs mal placés. Il ne peut pas deviner vos intentions de codage.
Les conseils les plus importants
Il existe quelques précautions de base que vous pouvez toujours prendre :
-
Utilisez le bon indentation du code ou d'adopter un style de codage noble. La lisibilité permet d'éviter les irrégularités.
-
Utilisez un IDE ou éditeur pour PHP avec coloration syntaxique . Ce qui aide également à équilibrer les parenthèses/parenthèses.
-
Lire la référence linguistique et des exemples dans le manuel. Deux fois, pour devenir quelque peu compétent.
Comment interpréter les erreurs d'analyse syntaxique
Un message d'erreur syntaxique typique se lit comme suit :
Erreur d'analyse : erreur de syntaxe, inattendu T_STRING en attendant ' ;
' sur file.php sur ligne 217
Qui énumère les possible l'emplacement d'une erreur de syntaxe. Voir la mention nom du fichier et numéro de ligne .
A moniker comme T_STRING
explique quel symbole le parseur/tokenizer n'a pas pu traiter finalement. Cependant, ce n'est pas nécessairement la cause de l'erreur de syntaxe.
Il est important d'examiner lignes de code précédentes également. Souvent, les erreurs de syntaxe ne sont que des mésaventures qui se sont produites plus tôt. Le numéro de la ligne d'erreur est juste l'endroit où l'analyseur syntaxique a définitivement renoncé à tout traiter.
Résoudre les erreurs de syntaxe
Il existe de nombreuses approches pour identifier et corriger les problèmes de syntaxe.
-
Ouvrez le fichier source mentionné. Regardez l'élément mentionné ligne de code .
-
Pour les chaînes de caractères qui s'emballent et les opérateurs mal placés, c'est généralement ici que vous trouverez le coupable.
-
Lisez la ligne de gauche à droite et imaginez ce que fait chaque symbole.
-
Plus régulièrement, vous devez regarder lignes précédentes également.
-
En particulier, les manques ;
les points-virgules manquent aux fins de ligne/déclaration précédentes. (Du moins du point de vue stylistique. )
-
Si {
blocs de code }
sont incorrectement fermés ou imbriqués, vous devrez peut-être chercher encore plus loin dans le code source. Utilisez les indentation du code pour simplifier cela.
-
Regardez le colorisation de la syntaxe !
-
Les chaînes de caractères, les variables et les constantes devraient toutes avoir des couleurs différentes.
-
Opérateurs +-*/.
devraient également être teintés de manière distincte. Sinon, ils pourraient être dans le mauvais contexte.
-
Si vous voyez que la colorisation de la chaîne s'étend trop loin ou trop court, alors vous avez trouvé une fermeture non encodée ou manquante. "
ou '
marqueur de chaîne.
-
La présence de deux caractères de ponctuation de même couleur l'un à côté de l'autre peut également être synonyme de problèmes. En général, les opérateurs sont seuls s'il ne s'agit pas de ++
, --
ou des parenthèses après un opérateur. Deux chaînes de caractères/identifiants qui se suivent directement sont incorrects dans la plupart des contextes.
-
L'espace blanc est votre ami . Suivez tout style de codage.
-
Coupez temporairement les longues files d'attente.
-
Vous pouvez librement ajouter des nouvelles lignes entre les opérateurs ou les constantes et les chaînes de caractères. L'analyseur syntaxique concrétisera ensuite le numéro de ligne pour les erreurs d'analyse. Au lieu de regarder le code très long, vous pouvez isoler le symbole syntaxique manquant ou mal placé.
-
Split up complex if
en déclarations distinctes ou imbriquées if
conditions.
-
Au lieu de longues formules mathématiques ou de chaînes logiques, utilisez des variables temporaires pour simplifier le code. (Plus lisible = moins d'erreurs).
-
Ajoutez des nouvelles lignes entre :
- Le code que vous pouvez facilement identifier comme étant correct,
- Les parties dont vous n'êtes pas sûr,
- Et les lignes dont l'analyseur syntaxique se plaint.
Partitionnement de longs blocs de code vraiment permet de localiser l'origine des erreurs de syntaxe.
-
Commentaire le code en question.
-
Si vous ne parvenez pas à isoler la source du problème, commencez à commenter (et donc à supprimer temporairement) des blocs de code.
-
Dès que vous vous êtes débarrassé de l'erreur d'analyse, vous avez trouvé la source du problème. Regardez de plus près.
-
Parfois, vous souhaitez supprimer temporairement des blocs complets de fonctions/méthodes. (Dans le cas d'accolades non assorties et de code mal indenté).
-
Lorsque vous ne parvenez pas à résoudre le problème de syntaxe, essayez de réécriture les sections commentées à partir de zéro .
-
En tant que nouveau venu, évitez certaines constructions syntaxiques déroutantes.
-
Le ternaire ? :
L'opérateur de condition peut compacter le code et est effectivement utile. Mais il ne facilite pas la lisibilité dans tous les cas. Préférez le simple if
des déclarations alors qu'elles ne sont pas connues.
-
La syntaxe alternative de PHP ( if:
/ elseif:
/ endif;
) est courant pour les modèles, mais sans doute moins facile à suivre que les modèles normaux. {
code }
blocs.
-
Les erreurs les plus courantes des nouveaux arrivants sont :
-
Points-virgules manquants ;
pour terminer les déclarations/lignes.
-
Des guillemets mal assortis pour la chaîne de caractères "
ou '
et des guillemets non évidés à l'intérieur.
-
Opérateurs oubliés, en particulier pour la chaîne de caractères .
concaténation.
-
asymétrique (
parenthèses )
. Comptez-les dans la ligne signalée. Sont-ils en nombre égal ?
-
N'oubliez pas que la résolution d'un problème de syntaxe peut faire apparaître le suivant.
-
Si vous faites disparaître un problème, mais qu'un autre réapparaît dans le code ci-dessous, vous êtes en grande partie sur la bonne voie.
-
Si, après modification, une nouvelle erreur de syntaxe apparaît sur la même ligne, votre tentative de modification a peut-être échoué. (Pas toujours cependant.)
-
Restaurez une sauvegarde du code qui fonctionnait précédemment, si vous ne pouvez pas le réparer.
- Adopter un système de gestion des versions du code source. Vous pouvez toujours consulter une
diff
de la version cassée et de la dernière version fonctionnelle. Ce qui pourrait nous éclairer sur le problème de syntaxe.
-
Caractères Unicode parasites invisibles : Dans certains cas, vous devez utiliser un éditeur hexadécimal ou un éditeur/visualisateur différent sur votre source. Certains problèmes ne peuvent pas être trouvés simplement en regardant votre code.
-
Essayez grep --color -P -n "\[\x80-\xFF\]" file.php
comme première mesure pour trouver les symboles non-ASCII.
-
En particulier, les nomenclatures, les espaces de largeur nulle, ou espaces insécables, et les guillemets intelligents peuvent régulièrement se retrouver dans le code source.
-
Prenez soin de ce qui type de rupture de ligne sont enregistrées dans des fichiers.
-
PHP honore juste \n les nouvelles lignes, pas \r les retours de chariot.
-
Ce qui est parfois un problème pour les utilisateurs de MacOS (même sur OS X pour les éditeurs mal configurés).
-
Souvent, le problème ne se pose que lorsqu'il s'agit d'une ligne unique. //
ou #
les commentaires sont utilisés. Multiline /*...*/
Les commentaires perturbent rarement l'analyseur syntaxique lorsque les sauts de ligne sont ignorés.
-
Si votre l'erreur de syntaxe ne se transmet pas sur le web : Il arrive que vous ayez une erreur de syntaxe sur votre machine. Mais en mettant le même fichier en ligne, cela ne se produit plus. Ce qui ne peut signifier que deux choses :
-
Vous regardez le mauvais fichier !
-
Ou votre code contenait un Unicode invisible (voir ci-dessus). Vous pouvez facilement le découvrir : Il suffit de recopier votre code du formulaire web dans votre éditeur de texte.
-
Vérifiez votre Version de PHP . Toutes les constructions syntaxiques ne sont pas disponibles sur tous les serveurs.
Ce ne sont pas nécessairement les mêmes. En particulier, lorsque vous travaillez avec des frameworks, vous devez les faire correspondre.
-
N'utilisez pas Les mots-clés réservés de PHP comme identifiants de fonctions/méthodes, de classes ou de constantes.
-
L'essai et l'erreur sont votre dernier recours.
Si tout le reste échoue, vous pouvez toujours google votre message d'erreur. Les symboles syntaxiques ne sont pas aussi faciles à rechercher (Stack Overflow lui-même est indexé par SymbolHound cependant). Il se peut donc que vous deviez parcourir quelques pages supplémentaires avant de trouver quelque chose de pertinent.
Autres guides :
Écran blanc de la mort
Si votre site Web est simplement vide, une erreur de syntaxe en est généralement la cause. Activez leur affichage avec :
error_reporting = E_ALL
display_errors = 1
Dans votre php.ini
en général, ou via .htaccess
pour mod_php, ou même .user.ini
avec des configurations FastCGI.
L'activer dans le script cassé est trop tard car PHP ne peut même pas interpréter/exécuter la première ligne. Une solution rapide consiste à créer un script enveloppant, par exemple test.php
:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Ensuite, invoquez le code défaillant en accédant à ce script enveloppant.
Il permet également d'activer la fonction error_log
et regarder dans votre du serveur web error.log
quand un script se bloque avec des réponses HTTP 500.
2 votes
Ce n'est pas assez de données pour être une réponse, mais on pourrait écrire un analyseur avec parsekit_compile_string, et y mettre des réponses plus amicales. S'il est intégré à votre IDE, cela pourrait être très instructif.
7 votes
Vous avez mis une quantité impressionnante de travail là-dedans. Je vous en remercie. C'est probablement très bien pour les enseignants d'apprendre à signaler rapidement les erreurs ou pour ceux qui créent des IDE ou mettent en œuvre des corrections rapides. Cependant, les IDE feront déjà efficacement la plupart de ce travail pour vous, comme le suggère @Panique. En outre, dans de nombreux cas, recommencer à zéro est une bonne option.
0 votes
Devons-nous ajouter la prévention des erreurs de PHP 7 ?
0 votes
@Rizier123 Bien sûr, si vous en avez une, ou juste un lien même. Je n'ai pas encore vu de questions moi-même. (Si c'est assez intéressant, je mettrai une prime :)
0 votes
Mario, je fortement Nous vous recommandons de prendre vos réponses spécifiques aux erreurs ici et de les extraire dans leurs propres paires de questions-réponses (ou de les ajouter aux questions existantes, lorsqu'elles existent), puis de supprimer ces réponses d'ici, de mettre à jour l'index pour créer un lien vers les questions distinctes, et de marquer cette question pour verrouillage. Le site contenu que vous avez créée ici est géniale, mais son utilité est paralysée par un manque d'accessibilité sur Google. J'ai découvert cette réponse aujourd'hui pour la première fois après avoir été actif sur Stack Overflow pendant des années.
1 votes
Lorsque je recherche sur Google les noms d'erreurs énumérés dans la question ici, je ne pas trouver ce poste sur la première page de Google, jamais. C'est un énorme gaspillage de ce qui est autrement un travail fantastique ! En tapant "unexpected T_STRING" sur Google, j'obtiens ce morceau d'ordure qui a 50 % de vues de plus que votre référence d'erreur complète ici. Cela pourrait être résolu facilement en extrayant les paires de questions-réponses avec de bons titres. Voir aussi : meta.stackoverflow.com/questions/314618/
0 votes
@MarkAmery Tout à fait d'accord. Mais cette référence est encore un ballon d'essai. Elle est à la limite du hors-sujet parce qu'elle couvre plusieurs sujets à la fois et n'aide pas à la googlelisation par elle-même. Ce qui, bien sûr, devrait être le cas. Le plan à long terme consiste à l'externaliser vers des résultats de classement plus élevés (en espérant qu'il y reste). Pour l'instant, il n'est utilisé que comme référence mémorable pour la fermeture de dupe conviviale pour les nouveaux arrivants - parce que trouver un dupe approprié exact La réponse à T_STRING était déjà presque impossible.
0 votes
@mario Je ne vois pas ce qui vous empêche de migrer la majeure partie du contenu vers les paires de questions-réponses pour le moment. Pour les réponses où tu couvres plusieurs types d'erreurs dans un seul post, je peux comprendre que cela demande un peu de réflexion et de soin, mais cela ne représente que quelques posts. Je déplacerais moi-même tout le reste, sauf que c'est votre contenu (et je n'ai pas la possibilité de supprimer les messages ici une fois que j'ai terminé). Pour ce qui est du hors-sujet, il y a quelques index de référence comme celui-ci et je défendrais farouchement le droit de celui-ci à exister... tant que le contenu est transféré.
0 votes
@mario Would
unexpected 'else' (T_ELSE)
relèvent de ces questions et réponses ? J'ai remarqué quelques questions dernièrement, mais je n'étais pas sûr à 100% de pouvoir utiliser cette question pour les clore. L'une d'entre elles, publiée aujourd'hui, est la suivante stackoverflow.com/q/374993622 votes
@Fred-ii- Je pense que la plupart des causes sont similaires à la
T_IF / T_FOREACH / ...
bloc. Cependant, je voulais compiler un résumé plus personnalisé pour les questions IF/ELSE/ELSEIF.0 votes
@Rizier123 Éditez ! - Ce n'est qu'un premier jet, il n'était pas destiné à rester comme ça. (Ça se lit encore trop comme une introduction de livre/tutoriel). Le format général des réponses est peut-être correct.
0 votes
Je pensais que vous aviez des idées sur la façon dont vous aimeriez le faire ou que vous pensiez que ce serait mieux, etc. Comme vous avez dit que vous vouliez externaliser ce genre de choses. Sinon, je ferais un brouillon et ensuite vous pourrez dire si c'est mieux ou pire :)
0 votes
@Rizier123 Nah, juste donner un tourbillon ici. Je ne suis pas vraiment attaché à une quelconque bizarrerie ou structure de formulation ;} De plus, c'est CW après tout (ça aurait dû être le cas depuis le début). Et les mods dorment, alors n'hésitez pas à éditer !
0 votes
@mario Vous avez déjà fait un si bon départ avec cette référence. Je ne sais pas si je peux rivaliser avec ça. J'ai l'impression d'échouer à chaque fois que j'essaie.
3 votes
Vous savez, j'aurais aimé avoir cette liste quand j'apprenais le PHP il y a des années. Très utile, surtout pour les débutants.
0 votes
Cette question aurait besoin d'une
T_USE
réponse à l'erreur d'analyse. J'ajouterai la réponse plus tard2 votes
@.. Excellente idée ; il y a eu pas mal de questions de ce genre récemment. Il faudrait cependant couvrir les trois cas les plus courants (import scope, traits, closures) si possible.