Erreurs d'analyse et de syntaxe en PHP ; et comment les résoudre ?
Tout le monde rencontre des erreurs de syntaxe. Même les programmeurs expérimentés font des fautes de frappe. Pour les nouveaux venus, cela fait partie du processus d'apprentissage. Cependant, il est souvent facile d'interpréter des messages d'erreur tels que :
PHP Parse error : syntax error, unexpected '{' ; in index.php on line 20 Le symbole inattendu n'est pas toujours le vrai coupable. Mais le numéro de ligne donne une idée approximative de l'endroit où commencer à chercher. Regardez toujours le contexte du code. L'erreur de syntaxe se cache souvent dans les lignes de code mentionnées ou dans les lignes de code précédentes. Comparez votre code avec les exemples de syntaxe du manuel. Bien que tous les cas ne correspondent pas les uns aux autres. Pourtant, il existe des [étapes générales pour résoudre les erreurs de syntaxe] (https://stackoverflow.com/a/18050072). Cette référence résume les pièges les plus courants :
- [Unexpected T_STRING] (https://stackoverflow.com/a/18092277)
- Unexpected T_VARIABLE
Unexpected '$varname' ; (T_VARIABLE)- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE- Fin inattendue
- T_FUNCTION inattendue...
- Unexpected
{
Unexpected}
Unexpected(
Unexpected)
- Unexpected
[
Unexpected]
- T_IF inattendu
T_FOREACH inattendu
T_FOR inattendu
T_WHILE inattendu
T_DO inattendu
T_PRINT inattendu
T_ECHO inattendu- T_LNUMBER inattendu
- Unexpected ?
- Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN)- Unexpected '=' ;
- Unexpected T_INLINE_HTML...
- Unexpected T_PAAMAYIM_NEKUDOTAYIM...
- T_OBJECT_OPERATOR non attendu...
- T_DOUBLE_ARROW non attendu...
- T_SL inattendu...
- Unexpected T_BOOLEAN_OR...
Unexpected T_BOOLEAN_AND...
https://stackoverflow.com/questions/8668461/unexpected-t-boolean-and-error-in-my-if-statement https://stackoverflow.com/questions/2641595/t-boolean-and-error -->- Inattendu T_IS_EQUAL
T_IS_GREATER_OR_EQUAL inattendu
Attendu T_IS_IDENTICAL
T_IS_NOT_EQUAL <br>. inattendu ; T_IS_NOT_IDENTICAL <br>. inattendu ; T_IS_SMALLER_OR_EQUAL <br>. inattendu ; Inattendu<
Inattendu>
- T_NS_SEPARATOR inattendu...
- Caractère inattendu dans l'entrée : '
\
' ; (ASCII=92) state=1- Caractère inattendu 'public' ; (T_PUBLIC)
Caractère inattendu 'private' ; (T_PRIVATE)
Caractère inattendu 'protected' ; (T_PROTECTED)
Caractère inattendu 'final' ; (T_FINAL)...- Inattendu T_STATIQUE... <br;-- https://stackoverflow.com/questions/2067560/why-php-4-4-9-throws-parse-error-syntax-error-unexpected-t-static -->
- T_CLASS inattendue...
- T_DNUMBER inattendu
- Caractère inattendu
,
(virgule)- Inattendu
.
(point)- Inattendu
;
(point-virgule).- Inattendu
*
(astérisque)- Inattendu
:
(deux points) Références étroitement liées :- Que signifie cette erreur en PHP ? (erreurs d'exécution)
- Parse error : syntax error, unexpected T_XXX
- Erreur de syntaxe : erreur de syntaxe, T_ENCAPSED_ET_WHITESPACE inattendue
- Erreur de syntaxe : erreur de syntaxe, T_VARIABLE inattendu
- Que signifie ce symbole en PHP (jetons de langage)](https://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php)
- Les guillemets intelligents
""
''` ne signifient rien en PHP](https://stackoverflow.com/questions/14303353/double-quotes-are-not-copied-normally-how-can-i-edit-them) Et :
- Le manuel PHP sur php.net et ses différents jetons de langage
- Ou l'introduction à la syntaxe de PHP de Wikipedia.
- Et enfin, notre php tag-wiki bien sûr. Bien que Stack Overflow accueille également les codeurs débutants, il est principalement destiné aux questions de programmation professionnelle.
- Répondre aux erreurs de codage et aux fautes de frappe de chacun est considéré comme hors sujet.
- Veuillez donc prendre le temps de suivre les [étapes de base] (https://stackoverflow.com/a/18050072), avant de poster des demandes de correction syntaxique.
Si vous devez quand même le faire, montrez votre propre initiative de résolution, vos tentatives de correction, et votre processus de réflexion sur ce qui semble ou pourrait être faux. Si votre navigateur affiche des messages d'erreur tels que "SyntaxError : illegal character" ;, alors il ne s'agit pas d'une [étiquette:php], mais d'une [étiquette:javascript]-erreur de syntaxe.
**Enfin, si l'erreur de syntaxe n'a pas été générée par la modification de votre base de code, mais par l'installation ou la mise à niveau d'un package d'un fournisseur externe, elle peut être due à une incompatibilité de la version de PHP, vérifiez donc les exigences du fournisseur par rapport à la configuration de votre plate-forme.
Quelles sont les erreurs de syntaxe ?
PHP fait partie des langages de programmation de type [C][1] et [impératif][2]. Il possède des règles de grammaire rigides, dont il ne peut se remettre lorsqu'il rencontre des symboles ou des identifiants mal placés. Il ne peut pas deviner vos intentions de codage. !Définition de la fonction syntaxe abstraite][3]
Conseils les plus importants
Il existe quelques précautions de base que vous pouvez toujours prendre :
Comment interpréter les erreurs d'analyseur syntaxique
Un message d'erreur syntaxique typique se lit comme suit :
;
aux fins de lignes/états précédents. (Au moins du point de vue stylistique. ){
blocs de code}
sont incorrectement fermés ou imbriqués, vous pouvez avoir besoin d'investiguer encore plus haut dans le code source. Utilisez une indentation de code appropriée pour simplifier cela.+-*/.
devraient aussi avoir des couleurs distinctes. Sinon, ils pourraient être dans le mauvais contexte."
ou'
manquant.++
,--
, ou des parenthèses qui suivent un opérateur. Deux chaînes de caractères/identifiants qui se suivent directement sont incorrects dans la plupart des contextes.Partitionner de longs blocs de code aide vraiment à localiser l'origine des erreurs de syntaxe.
? :
peut compacter le code et est effectivement utile. Mais il n’aide pas à la lisibilité dans tous les cas. Préférez les instructions "if" simples lorsque vous n'avez pas d'informations.if:
/elseif:
/endif;
) est courante pour les modèles, mais sans doute moins facile à suivre que les blocs de{code
}` normaux.;
pour terminer les instructions/lignes."
ou'
et des guillemets non encodés à l'intérieur..
.(
parenthèses)
déséquilibrés. Comptez-les dans la ligne signalée. Y en a-t-il un nombre égal ?diff
de la version cassée et de la dernière version fonctionnelle. Ce qui pourrait vous éclairer sur la nature du problème de syntaxe.grep --color -P -n "\[\x80-\xFF\]" ; file.php
][9] comme première mesure pour trouver les symboles non-ASCII.//
ou#
d'une seule ligne sont utilisés. Les commentaires multilignes/*...*/
perturbent rarement l'analyseur lorsque les sauts de ligne sont ignorés.php -v
pour l'interpréteur de ligne de commande<?php phpinfo();
pour celui invoqué via le serveur web. Ce ne sont pas forcément les mêmes. En particulier, lorsque vous travaillez avec des frameworks, vous devez les faire correspondre.É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
][18] en général, ou via [.htaccess
][19] pour mod_php, ou même [.user.ini
][20] 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 d'enveloppe, disonstest.php
:Ensuite, invoquez le code défaillant en accédant à ce script enveloppe. Il est également utile d'activer le
error_log
de PHP et de consulter leerror.log
de votre [serveur web][21] lorsqu'un script se bloque avec des réponses HTTP 500. [1] : http://en.wikipedia.org/wiki/List_of_C-based_programming_languages [2] : http://en.wikipedia.org/wiki/Imperative_programming [3] : http://i.stack.imgur.com/jY6k7.gif [4] : http://en.wikipedia.org/wiki/List_of_PHP_editors [5] : http://i.stack.imgur.com/z2FBC.png [6] : http://www.php.net/langref [7] : http://php.net/tokens[9] : https://stackoverflow.com/questions/3001177/how-do-i-grep-for-all-non-ascii-characters-in-unix [10] : http://www.php.net/reserved.keywords [11] : http://symbolhound.com/ [12] : http://www.onlamp.com/pub/a/php/2004/08/12/debuggingphp.html [13] : http://jason.pureconcepts.net/2013/05/fixing-php-errors/ [14] : http://www.phpreferencebook.com/misc/php-errors-common-mistakes/ [15] : http://coursesweb.net/php-mysql/common-php-errors-solution_t [16] : http://diythemes.com/thesis/troubleshoot-wordpress-website/ [17] : http://coding.smashingmagazine.com/2011/11/30/a-guide-to-php-error-messages-for-designers/ [18] : http://www.php.net/manual/en/configuration.file.php [19] : http://www.php.net/manual/en/configuration.changes.php [20] : http://php.net/manual/en/configuration.file.per-user.php [21] : http://www.cyberciti.biz/faq/apache-logs/
Unexpected T_VARIABLE
Un "unexpected
T_VARIABLE
" ; signifie qu’il y a un nom littéral de$variable
, qui ne s’inscrit pas dans la structure actuelle de l’expression/de l’état.!diagramme opérateur+$variable volontairement abstrait/inexact][1]
Point-virgule manquant
Il indique le plus souvent [un point-virgule manquant] (https://stackoverflow.com/questions/9135784/syntax-error-unexpected-t-variable) dans la ligne précédente. Les affectations de variables qui suivent une instruction sont un bon indicateur de l'endroit où chercher :
concaténation de chaînes
Les [concaténations de chaînes] (https://stackoverflow.com/questions/14606145/php-syntax-error-unexpected-t-variable-expecting-or-on-line-29) avec l'opérateur
.
oublié sont une erreur fréquente :En fait, il faut préférer les interpolations de chaînes de caractères (variables de base entre guillemets) quand cela aide à la lisibilité. Ce qui permet d'éviter ces problèmes de syntaxe.
Opérateurs d'expression manquants
Bien sûr, le même problème peut se poser pour d'autres expressions, par exemple les opérations arithmétiques :
PHP ne peut pas deviner si la variable doit être ajoutée, soustraite ou comparée, etc.
Listes
Idem pour les listes syntaxiques, comme dans les populations de tableaux, où l'analyseur syntaxique indique également une virgule attendue
,
par exemple :Ou des listes de paramètres de fonctions :
Vous pouvez également voir cela avec les instructions
list
ouglobal
, ou lorsqu'il manque un point-virgule;
dans une bouclefor
.Déclarations de classes
Cette erreur d'analyse syntaxique se produit également [dans les déclarations de classes] (https://stackoverflow.com/questions/5122729/im-getting-a-syntax-error-unexpected-t-variable-error-i-dont-see-what-im). Vous ne pouvez affecter que des constantes statiques, pas des expressions. L'analyseur syntaxique se plaint donc des variables en tant que données assignées :
Des accolades fermantes
}
non appariées peuvent en particulier mener ici. Si une méthode se termine trop tôt (utilisez une indentation correcte !), une variable perdue est souvent mal placée dans le corps de la déclaration de la classe.Variables après les identifiants
Vous ne pouvez jamais faire suivre une variable d'un identifiant (https://stackoverflow.com/questions/12194156/php-syntax-error-unexpected-t-variable) directement :
En fait, il s'agit d'un exemple courant où l'intention était d'utiliser variables variables peut-être. Dans ce cas, une recherche de propriété de variable avec
$this->{"myFunc$VAR"}();
par exemple.Parenthèses manquantes après des constructions linguistiques
Une saisie hâtive peut entraîner l'oubli de parenthèses ouvrantes pour les instructions "if", "for" et "foreach" :
Solution : ajoutez l'ouverture manquante
(
entre la déclaration et la variable.Else ne s'attend pas à des conditions
Solution : Supprimez les conditions de
else
ou utilisezelseif
.Besoin de parenthèses pour la fermeture
Solution : Ajoutez des parenthèses autour de
$var
.Espaces blancs invisibles
Comme mentionné dans la réponse de référence sur "Invisible stray Unicode" ; (tel qu'un espace insécable), vous pouvez également voir cette erreur pour un code sans méfiance comme :
C’est plutôt répandu en début de fichiers et pour le code copié-collé. Vérifiez avec un éditeur hexadécimal, si votre code ne semble pas visuellement contenir un problème de syntaxe.
Voir aussi
[1] : http://i.stack.imgur.com/DCDkL.gif
Unexpected T_STRING
T_STRING
est un peu un terme mal choisi. Il ne fait pas référence à une"string"
entre guillemets. Il signifie qu'un identifiant brut a été rencontré. Il peut s'agir de motsbare
, de restes deCONSTANT
ou de noms de fonctions, de chaînes de caractères oubliées non citées, ou de n'importe quel texte brut.Chaînes de caractères mal citées
Cette erreur de syntaxe est toutefois plus fréquente pour les chaînes de caractères mal citées. Tout guillemet " "`" ou "'`" non encodé et errant formera une expression invalide : ⇓ ⇓ echo "click here" ; La coloration syntaxique rendra ces erreurs super évidentes. Il est important de ne pas oublier d'utiliser les barres obliques inversées pour échapper aux guillemets doubles ou aux guillemets simples, en fonction de ce qui a été utilisé comme [string enclosure][1]. - Pour des raisons de commodité, vous devriez préférer les guillemets simples externes lorsque vous produisez du HTML simple avec des guillemets doubles à l'intérieur. - Utilisez des chaînes entre guillemets doubles si vous voulez interpoler des variables, mais faites alors attention à l'échappement des guillemets doubles littéraux `"`. - Pour une sortie plus longue, préférez plusieurs lignes `echo`/`print` au lieu d'échapper les entrées et sorties. Mieux encore, envisagez une section [HEREDOC][2]. Voir aussi *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Chaînes non fermées
Si vous [oubliez d'insérer un `"`' final][3], une erreur de syntaxe se produit généralement par la suite. Une chaîne non terminée consommera souvent un peu de code jusqu'à la prochaine valeur de chaîne prévue : ⇓ echo "Some text" ;, $a_variable, "and some runaway string ; success("finished" ;); ⇯ Il n'y a pas que les `T_STRING` littérales que l'analyseur syntaxique peut protester alors. Une autre variation fréquente est un [`Unexpected '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) pour un HTML littéral non cité.Guillemets de chaîne non programmés
Si vous *copiez et collez* le code d'un blog ou d'un site Web, vous vous retrouvez parfois avec un code invalide. [Les guillemets typographiques ne correspondent pas à ce que PHP attend : $text = 'Quelque chose quelque chose..' + "These ain't quotes" ; Les guillemets typographiques/intelligents sont des symboles Unicode. PHP les traite comme faisant partie d'un texte alphanumérique. Par exemple, `"these`" est interprété comme un identifiant constant. Mais tout texte littéral suivant est alors vu comme un mot nu/T_STRING par l'analyseur.Le point-virgule manquant ; encore
Si vous avez une expression non terminée dans les lignes précédentes, alors toute déclaration ou construction linguistique suivante est considérée comme un identifiant brut : ⇓ func1() function2() ; PHP ne peut pas savoir si vous avez voulu exécuter deux fonctions l'une après l'autre, ou si vous avez voulu multiplier leurs résultats, les additionner, les comparer, ou n'exécuter qu'une `||` ou l'autre.Balises ouvertes courtes et
C'est plutôt rare. Mais si les short_open_tags sont activés, alors vous ne pouvez pas commencer vos scripts PHP [par une déclaration XML][5] : ⇓ <?xml version="1.0"?> PHP verra le `<?` et le réclamera pour lui-même. Il ne comprendra pas à quoi est destiné le `xml` égaré. Il sera interprété comme une constante. Mais la `version` sera vue comme un autre littéral/constant. Et comme l'analyseur syntaxique ne peut pas donner de sens à deux valeurs littérales consécutives sans opérateur d'expression entre elles, ce sera un échec de l'analyse.<?xml
en-têtes dans les scripts PHP;
à chaque début de ligne : <?php ;print 123 ; Le point-virgule supplémentaire;
ici convertira le caractère invisible précédent en une référence constante indéfinie (expression comme déclaration). Ce qui, en retour, permet à PHP de produire un avis utile.Le signe `$` manquant devant les noms de variables
[Les variables en PHP][7] sont représentées par un signe dollar suivi du nom de la variable. Le signe dollar (`$`) est un [sigle][8] qui indique que l'identifiant est le nom d'une variable. Sans ce sigle, l'identifiant pourrait être un [mot-clé du langage][9] ou une [constante][10]. C'est une erreur courante lorsque le code PHP a été ["traduit" ; à partir d'un code écrit dans un autre langage][11] (C, Java, JavaScript, etc.). Dans de tels cas, une déclaration du type de la variable (lorsque le code original a été écrit dans un langage qui utilise des variables typées) peut également se faufiler et produire cette erreur.Guillemets échappés
Si vous utilisez des guillemets dans une chaîne de caractères, ils ont une signification particulière. Il s'agit d'un " ;[Caractère d'échappement][12]" ; qui indique normalement à l'analyseur syntaxique de prendre le caractère suivant littéralement. Exemple : `echo 'Jim a dit 'Bonjour'''`s'imprimera `Jim a dit 'Bonjour'``. Si vous échappez le guillemet fermant d'une chaîne, le guillemet fermant sera pris littéralement et non comme prévu, c'est-à-dire comme un guillemet imprimable faisant partie de la chaîne et ne fermant pas la chaîne. Cela se traduira par une erreur d'analyse, généralement après l'ouverture de la chaîne suivante ou à la fin du script. Erreur très fréquente lors de la spécification des chemins d'accès sous Windows : `"C:\xampp\htdocs\"` est incorrect. Vous avez besoin de `"C:\xampp\\\htdocs\\\"`. [1] : http://php.net/language.types.string [2] : http://php.net/heredoc [3] : https://stackoverflow.com/questions/13968629/php-parse-error-syntax-error-unexpected-t-string [4] : https://stackoverflow.com/questions/7762558/php-t-string-error [5] : https://stackoverflow.com/questions/4361750/why-when-add-xml-version-1-0-encoding-utf-8-to-web-page-dont-work-on-ho [6] : http://en.wikipedia.org/wiki/Non-breaking_space [7] : http://php.net/manual/en/language.variables.basics.php [8] : https://en.wikipedia.org/wiki/Sigil_(programmation informatique) [9] : http://php.net/manual/en/reserved.keywords.php [10] : http://php.net/manual/en/language.constants.php [12] : http://php.net/manual/en/regexp.reference.escape.php