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.
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]
Il existe quelques précautions de base que vous pouvez toujours prendre :
Un message d'erreur syntaxique typique se lit comme suit :
Parse error : syntax error, unexpected T_STRING, expecting '
;
' in file.php on line 217 Qui liste l'emplacement possible d'une erreur de syntaxe. Voir le nom du fichier et le numéro de ligne mentionnés. Un [moniker][7] tel queT_STRING
explique quel symbole le parser/tokenizer n'a finalement pas pu traiter. Cependant, ce n'est pas nécessairement la cause de l'erreur de syntaxe. Il est important d'examiner également les lignes de code précédentes. Souvent, les erreurs de syntaxe ne sont que des mésaventures qui se sont produites auparavant. Le numéro de la ligne d'erreur est simplement l'endroit où l'analyseur syntaxique a définitivement renoncé à tout traiter.Résoudre les erreurs de syntaxe
Il existe de nombreuses approches pour réduire et corriger les problèmes de syntaxe.
;
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.? :
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.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, disons 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 enveloppe.
Il est également utile d'activer le error_log
de PHP et de consulter le error.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/
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]
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 :
⇓
func1()
$var = 1 + 2 ; # erreur d'analyse à la ligne +2
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 :
⇓
print "Voici la valeur : " ; $valeur ;
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.
L'interpolation de chaînes est une fonctionnalité de base du langage de script. Il n'y a pas de honte à l'utiliser. Ignorez les conseils de micro-optimisation selon lesquels la concaténation de variables
.
est plus rapide. **Ce n'est pas le cas.
Bien sûr, le même problème peut se poser pour d'autres expressions, par exemple les opérations arithmétiques :
⇓
print 4 + 7 $var ;
PHP ne peut pas deviner si la variable doit être ajoutée, soustraite ou comparée, etc.
Idem pour les listes syntaxiques, comme dans les populations de tableaux, où l'analyseur syntaxique indique également une virgule attendue ,
par exemple :
⇓
$var = array("1" ; => $val, $val2, $val3 $val4) ;
Ou des listes de paramètres de fonctions :
⇓
fonction myfunc($param1, $param2 $param3, $param4)
Vous pouvez également voir cela avec les instructions list
ou global
, ou lorsqu'il manque un point-virgule ;
dans une boucle for
.
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 :
class xyz { ⇓
var $value = $_GET["input" ;];
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.
Vous ne pouvez jamais faire suivre une variable d'un identifiant (https://stackoverflow.com/questions/12194156/php-syntax-error-unexpected-t-variable) directement :
⇓
$this->myFunc$VAR() ;
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.
Gardez à l'esprit que l'utilisation de variables doit être l'exception. Les nouveaux venus essaient souvent de les utiliser de manière trop désinvolte, même lorsque des tableaux seraient plus simples et plus appropriés.
Une saisie hâtive peut entraîner l'oubli de parenthèses ouvrantes pour les instructions "if", "for" et "foreach" :
⇓
foreach $array as $key) {
Solution : ajoutez l'ouverture manquante (
entre la déclaration et la variable.
⇓
else ($var >= 0)
Solution : Supprimez les conditions de else
ou utilisez elseif
.
⇓
function() utilise $var {}
Solution : Ajoutez des parenthèses autour de $var
.
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 :
<?php
⇐
$var = new PDO(...) ;
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.
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 mots bare
, de restes de CONSTANT
ou de noms de fonctions, de chaînes de caractères oubliées non citées, ou de n'importe quel texte brut.
<?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.