PHP parse/les erreurs de syntaxe; et comment les résoudre?
Tout le monde court dans les erreurs de syntaxe. Même les programmeurs expérimentés de faire des fautes de frappe. Pour les nouveaux arrivants, c'est juste une partie du processus d'apprentissage. Toutefois, il est souvent facile à interpréter les messages d'erreur tels que:
PHP Parse error: syntax error, unexpected '{' in index.php sur la ligne 20
Le symbole inattendu n'est pas toujours le vrai coupable. Mais le numéro de la ligne donne une idée approximative de l'endroit où commencer à chercher.
Toujours regarder la code contexte. La syntaxe erreur est souvent caché dans la ou dans précédentes lignes de code. Comparez votre code contre des exemples de syntaxe dans le manuel.
Alors que tous les cas ne correspond à l'autre. Pourtant, il y a quelques les étapes générales pour résoudre les erreurs de syntaxe.
Cette référence a résumé les écueils les plus courants:
-
Inattendu T_CONSTANT_ENCAPSED_STRING
Inattendue T_ENCAPSED_AND_WHITESPACE -
Inattendue continuer (T_CONTINUE)
Inattendu continuer (T_BREAK)
Inattendu continuer (T_RETURN) -
Inattendu
,
(virgule) -
Unpexected
.
(période) -
Inattendu
;
(point-virgule) -
Inattendu
*
(astérisque) -
Inattendu
:
(côlon)
Étroitement liés références:
- Que signifie cette erreur signifie en PHP? (les erreurs d'exécution)
- Qu'est-ce symbole signifie en PHP? de la langue (les jetons)
- Ceux
“”
smart‘
citations ne signifient rien pour PHP
Et:
- La Manuel PHP sur php.net et de ses divers langue jetons
- Ou de Wikipédia en syntaxe introduction à PHP.
- Et enfin notre php balise wiki de cours.
Tout Débordement de Pile est aussi accueillant recrue codeurs, c'est surtout destinée aux professionnels les questions de programmation.
- De répondre à tout le monde de codage des erreurs et étroit fautes de frappe est majoritairement considérées comme hors-sujet.
- Merci donc de prendre le temps de suivre la étapes de base, avant l'affichage de la syntaxe de la fixation des demandes.
- Si vous avez encore à, s'il vous plaît montrer votre propre résolution de l'initiative, de la tentative de correctifs et de votre processus de pensée sur ce qu'il regarde ou peut-être faux.
Si votre navigateur affiche des messages d'erreur tels que "SyntaxError: caractère illégal", alors ce n'est pas vraiment php-connexes, mais un javascript-erreur de syntaxe.
Les erreurs de syntaxe soulevées sur le code du fournisseur de: Enfin, considérer que, si l'erreur de syntaxe n'a pas été soulevée par l'édition de votre base de code, mais après un fournisseur externe package d'installation ou de mise à niveau, il pourrait être dû à la version de PHP incompatibilité, afin de vérifier besoins des fournisseurs à l'encontre de votre plate-forme de l'installation.
- Ce n'est pas assez de données pour être une réponse, mais on pourrait écrire un analyseur avec parsekit_compile_string, et de mettre davantage l'amicale des réponses sur elle. Si elle est intégrée dans votre IDE, cela pourrait être très instructif.
- Vous mettez une quantité impressionnante de travail dans ce. Le Respect de cette. Il est probablement très bon pour les enseignants à apprendre à jeûner signaler des erreurs ou de ceux qui créent des IDEs ou de mettre en œuvre des solutions rapides. Cependant, IDEs va déjà faire la plupart de ce travail pour vous, comme @Panique suggère. En outre, im de nombreux cas, le début de nouveau à partir de zéro est une bonne option.
- Devrions-nous ajouter PHP 7 erreurs de prévention?
- Bien sûr, si vous en avez un, ou tout simplement un lien même. Je n'ai pas encore vu les questions moi-même. (Si il est assez intéressant, je vais le jeter dans un bounty.. 🙂
- mario, je vous recommande de prendre votre erreur spécifique réponses ici et décompressez-les dans leur propre Q&Une des paires (ou de contribuer à des questions existantes, lorsqu'elles existent), puis supprimer les réponses à partir d'ici, de mettre à jour l'index de lien pour les questions distinctes, et le drapeau de cette question pour le verrouillage. Le contenu que vous avez créé ici est génial, mais son utilité est handicapé par un manque de localisation sur Google, j'ai découvert cette réponse aujourd'hui pour la première fois après être actif sur le Débordement de la Pile pendant des années.
- Quand je Google pour l'erreur des noms cités dans la question ici, je ne trouve pas ce post sur la première page de Google, jamais. C'est un énorme gaspillage de ce qui est autrement un travail fantastique! Googler "unexpected T_STRING" me met ce morceau d'ordures qui a 50% que de nombreux points de vue l'ensemble de votre erreur de référence ici. Cela pourrait facilement être résolu par l'extraction de la sortie Q&Une des paires avec de bons titres. Voir aussi: meta.stackoverflow.com/questions/314618/...
- Entièrement d'accord. Mais cette référence est un test de ballon encore. C'est en bordure de sur hors-sujet, car il couvre plusieurs sujets à la fois et ne veut pas de l'aide googleability par lui-même. Ce qui, bien sûr, il faut. Outsouring en plus les résultats du classement (et en espérant qu'il y reste) est le plan à long terme. Pour le moment, il est juste utilisé comme mémorable de référence pour les nouveaux arrivants-friendly dupe de clôture - parce que la recherche d'un raccord exacte T_STRING réponse était presque impossible déjà.
- Je ne suis pas sûr de ce que vous empêche de migrer la plupart du contenu à l'auto-répondu Q&Une des paires maintenant? Pour les réponses où vous couvrir plusieurs types d'erreur dans un post, je peux voir comment cela pourrait exiger de la réflexion et de soins, mais c'est seulement un couple de postes. Je devais déménager tout le reste dès maintenant moi-même sauf que c'est votre contenu (et je n'ai pas la possibilité de supprimer les messages ici une fois que je suis fait). Aussi loin que topicness va, il ya quelques indices de référence de ce genre et j'avais farouchement défendre le droit de celui-ci d'exister... tant que le contenu est transférée.
- Serait
unexpected 'else' (T_ELSE)
relèvent de cette Q&A? J'ai remarqué quelques questions ces derniers temps, mais n'était pas sûr à 100% si je pouvais utiliser cette question pour les fermer avec. Un posté aujourd'hui stackoverflow.com/q/37499362 - Je pense que la plupart des causes sont similaires à la
T_IF / T_FOREACH / ...
bloc. Mais j'ai voulu compiler un plus personnalisé résumé pour les if/ELSE/ELSEIF questions. - Ne sais pas comment cette phrase, mais il faut Q&A peut-être un peu réécrit et plus structurée? (temp commentaire)
- Edit loin! - C'est presque toujours le projet initial, ce n'était pas destiné à le rester. (Lit encore trop comme un livre/tutoriel intro). L'ensemble du format de la réponse est peut-être bien.
- Eh bien, je pense que vous avez des idées comment vous aimeriez qu'il ou pense qu'il serait mieux ou pas? Comme vous l'avez dit que vous avez voulu externaliser ce genre de choses. Sinon, je voudrais faire un résumé projet et ensuite vous pouvez le dire si c'est mieux ou pire? 🙂
- Nah, juste lui donner tourbillon ici. Je ne suis pas vraiment attaché à toute formulation caprice ou de la structure ;} Aussi, c'est la CW, après tout (doit avoir été dès le départ). Et, les mods sont endormis, donc l'éditer de suite!!!
- Vous avez déjà fait un bon départ avec cette référence. Je ne sais pas si je peut rivaliser avec ça. Se sent juste comme j'échoue à chaque fois j'ai même essayer.
- Vous le savez, je souhaite que j'avais eu cette liste quand j'étais en train d'apprendre le PHP il y a des années.Très utile, surtout pour les débutants.
Vous devez vous connecter pour publier un commentaire.
Quelles sont les erreurs de syntaxe?
PHP appartient à la De style C et impératif langages de programmation. Il est rigide des règles de grammaire, qui ne peut être récupéré à partir de quand vous rencontrez des égarés des symboles ou des identificateurs. Il ne peut pas deviner vos intentions de codage.
Plus important conseils
Il y a quelques précautions de base, vous pouvez toujours prendre:
Utiliser la bonne code de l'indentation, ou d'adopter toute noble style de codage.
La lisibilité empêche d'irrégularités.
Utiliser un IDE ou de l'éditeur de PHP avec la coloration syntaxique.
Qui aussi aider avec des parenthèses/support d'équilibrage.
Lire la langue de référence et des exemples dans le manuel.
Deux fois, pour devenir assez compétent.
Comment interpréter les erreurs d'analyse
Typique d'un message d'erreur de syntaxe lit:
Qui répertorie les possible emplacement d'une erreur de syntaxe. Voir le mentionné nom de fichier et numéro de ligne.
Un moniker comme
T_STRING
explique le symbole de l'analyseur/générateur de jetons n'a pas pu traiter enfin. Ce n'est pas nécessairement la cause de la syntaxe erreur, cependant.Il est important de rechercher des précédentes lignes de code ainsi. Souvent, les erreurs de syntaxe sont juste des mésaventures qui s'est passé plus tôt. L'erreur numéro de ligne où l'analyseur de façon concluante a donné jusqu'à le traiter de tous.
Résoudre les erreurs de syntaxe
Il existe de nombreuses approches pour affiner et corriger la syntaxe hoquet.
Ouvrir la source mentionnée fichier. Regarder le mentionné ligne de code.
Pour runaway cordes et égaré les opérateurs, c'est généralement là où vous trouver le coupable.
Lire la ligne de la gauche vers la droite et d'imaginer ce que chaque symbole ne.
Plus régulièrement, vous avez besoin de regarder les lignes précédentes ainsi.
En particulier, manquant
;
des points-virgules sont portées disparues à la ligne précédente se termine ou de la déclaration. (Au moins du point de vue stylistique. )Si
{
blocs de code}
sont mal fermés ou imbriqués, vous devrez peut-être étudier encore plus haut dans le code source. Utiliser de façon appropriée les code de l'indentation pour simplifier qu'.Regarder la la colorisation de la syntaxe!
Les chaînes et les variables et les constantes ont tous des couleurs différentes.
Opérateurs
+-*/.
devrait être teinté distincte ainsi. D'autre ils pourraient être dans le mauvais contexte.Si vous voyez de la chaîne de colorisation étendre trop loin ou trop court, alors vous avez trouvé une sans échappement ou le manque de fermeture de
"
ou'
chaîne de marqueur.Avoir deux de la même couleur les caractères de ponctuation, à côté de l'autre peut aussi signifier des ennuis. Généralement, les opérateurs sont isolés si ce n'est pas
++
,--
, ou entre parenthèses à la suite d'un opérateur. Deux chaînes/identifiants directement à la suite les uns des autres sont incorrectes dans la plupart des contextes.Espace est votre ami.
Suivez tout style de codage.
Éviter les longues lignes temporairement.
Vous pouvez librement ajouter des retours à la ligne entre les opérateurs ou les constantes et les chaînes de caractères. L'analyseur sera alors de concrétiser le numéro de la ligne pour l'analyse des erreurs. Au lieu de regarder le très long code, vous pouvez isoler les personnes disparues ou égarées syntaxe symbole.
Diviser complexe
if
déclarations distinctes ou imbriquésif
conditions.Au lieu de longues formules mathématiques ou de la logique des chaînes, utiliser des variables temporaires pour simplifier le code. (Plus lisible = moins d'erreurs.)
Ajouter des retours à la ligne entre:
Partitionnement de longs blocs de code vraiment aide à localiser l'origine d'erreurs de syntaxe.
Commentaire code fautif.
Si vous ne pouvez pas isoler la source du problème, commencer à commenter (et donc de supprimer temporairement) des blocs de code.
Dès que vous vous débarrasser de l'erreur d'analyse, vous avez trouvé la source du problème. Regarder de plus près il.
Parfois, vous voulez supprimer temporairement complète de la fonction/méthode des blocs. (Dans le cas d'une incomparable accolades, et à tort, code indenté.)
Lorsque vous ne pouvez pas résoudre le problème de syntaxe, essayez de réécrire le commentaire sur les articles à partir de zéro.
En tant que nouveau venu, éviter certains de la confusion de la syntaxe des constructions.
Le ternaire
? :
opérateur de condition peut code compact et est utile en effet. Mais il n'a pas d'aide de la lisibilité dans tous les cas. Préférez plaineif
consolidés alors que unversed.PHP syntaxe alternative (
if:
/elseif:
/endif;
) est commun pour les modèles, mais sans doute moins facile à suivre que la normale{
code}
blocs.La plus répandue des nouveaux arrivants les erreurs sont:
Manque des points-virgules
;
pour mettre fin à des relevés de lignes.Incompatibles chaîne de devis pour des
"
ou'
et sans échappement cite dans.Oublié les opérateurs, en particulier pour la chaîne
.
concaténation.Déséquilibrée
(
parenthèses)
. Les compter dans déclarés à la ligne. Existe-il un nombre égal d'entre eux?N'oubliez pas que la résolution d'un problème de syntaxe pouvez découvrir la prochaine.
Si vous en faites une question de s'en aller, mais d'autres cultures, dans certains code ci-dessous, vous êtes principalement sur le droit chemin.
Si après l'édition d'une nouvelle erreur de syntaxe cultures dans la même ligne, alors votre tentative de changement était peut-être un échec. (Pas toujours cependant).
Restaurer une sauvegarde de l'ancien code, si vous ne pouvez pas réparer.
diff
de la rupture et de la dernière version de travail. Qui pourrait être éclairante à ce que le problème de syntaxe est.Invisible errants caractères Unicode: Dans certains cas, vous devez utiliser un hexeditor ou autre éditeur/viewer sur votre source. Certains problèmes ne peuvent pas être trouvés juste en regardant votre code.
Essayer
grep --color -P -n "\[\x80-\xFF\]" file.php
que la première mesure de trouver des symboles ASCII.En particulier les Nomenclatures, espaces de largeur nulle, ou les espaces insécables, et les guillemets régulièrement, peuvent trouver leur chemin dans le code source.
Prendre soin de ce qui type de retours à la ligne ( sont enregistrés dans des fichiers.
PHP juste honneurs \n les sauts de lignes, pas de \r des retours chariot.
Qui est parfois un problème pour les utilisateurs de MacOS (même sur les OS X pour le mal des éditeurs).
Il souvent que des surfaces comme un problème lors de l'unique ligne de
//
ou#
les observations sont utilisées. Multiline/*...*/
les commentaires ne sont que rarement perturber l'analyseur lors de mais les sauts de ligne sont ignorés.Si votre erreur de syntaxe ne pas transmettre sur le web:
Il arrive que vous avez une erreur de syntaxe sur votre machine. Mais la publication de la très même fichier en ligne ne présentent pas plus. Ce qui ne peut signifier qu'une de deux choses l'une:
Vous cherchez au mauvais fichier!
Ou votre code contenu invisible errants Unicode (voir ci-dessus).
Vous pouvez trouver facilement: il suffit de copier votre code de retour du formulaire web dans votre éditeur de texte.
Vérifier votre la version de PHP. Pas tous de la syntaxe des constructions sont disponibles sur tous les serveurs.
php -v
pour l'interpréteur de ligne de commande<?php phpinfo();
pour celle invoquée par le serveur web.Ceux qui ne sont pas nécessairement les mêmes. En particulier lorsque l'on travaille avec les cadres, vous serez à la hauteur.
Ne pas utiliser PHP des mots clés réservés comme des identificateurs de fonctions/méthodes, des classes ou des constantes.
Essai-et-erreur est votre dernier recours.
Si tout le reste échoue, vous pouvez toujours google votre message d'erreur. La syntaxe des symboles ne sont pas aussi faciles à rechercher (Débordement de Pile elle-même est indexé par SymbolHound tout de même). Par conséquent, il peut prendre la recherche à travers des quelques pages avant de trouver quelque chose de pertinent.
D'autres guides:
Écran blanc de la mort
Si votre site web est juste vide, puis généralement une erreur de syntaxe en est la cause.
De permettre leur affichage avec:
error_reporting = E_ALL
display_errors = 1
Dans votre
php.ini
en général, ou par l'intermédiaire de.htaccess
pour mod_php,ou même
.de l'utilisateur.ini
avec FastCGI configurations.Permettant ainsi à l'intérieur de l'écriture est trop tard, car PHP ne peut même pas l'interpréter/exécution de la première ligne. Une première solution rapide est l'artisanat d'un script de lancement, dire
test.php
:Alors invoquer le défaut de code en accédant à ce script.
Il permet également d'activer PHP
error_log
et de regarder dans votre serveurerror.log
lorsqu'un script se bloque avec HTTP 500 réponses.error_reporting(E_ALL | E_STRICT);
pour les versions antérieures de PHPJe pense que ce sujet est totalement overdiscussed/trop compliqué. À l'aide d'un IDE est LA voie à suivre pour éviter les erreurs de syntaxe. Je dirais même que le fait de travailler sans IDE est une sorte de manque de professionnalisme. Pourquoi? Parce que les Ide modernes vérifiez votre syntaxe après chaque caractère que vous tapez. Lorsque vous code et de l'ensemble de votre ligne devient rouge, et un gros message d'avertissement vous indique le type exact et la position exacte de l'erreur de syntaxe, alors il n'y a absolument pas besoin de chercher une autre solution.
À l'aide d'une syntaxe de vérification des IDE signifie:
Vous aurez (efficacement) ne jamais courir dans les erreurs de syntaxe de nouveau, tout simplement parce que vous les voyez à droite à mesure que vous tapez. Sérieusement.
Excellentes IDEs avec vérification de la syntaxe (tous sont disponibles pour Linux, Windows et Mac):
Inattendu
[
Ces jours-ci, de l'inattendu
[
de la matrice de support est généralement vu sur obsolètes les versions de PHP. Le bref la syntaxe de tableau est disponible depuis PHP >= 5.4. Les installations plus anciennes seul soutienarray()
.Tableau de résultat de la fonction de déférence n'est pas disponible pour les anciennes versions de PHP:
De référence - Ce qui fait cette erreur signifie en PHP? - "Syntax error, unexpected
\[
" montre la plus commune et la pratique des solutions de contournement.Cependant, vous êtes toujours mieux de mettre à niveau votre installation de PHP. Pour les plans d'hébergement mutualisé, de recherche d'abord si par exemple
SetHandler php56-fcgi
peut être utilisé pour activer une nouvelle exécution.Voir aussi:
BTW, il y a aussi des préprocesseurs et PHP 5.4 syntaxe bas-convertisseurs si vous êtes vraiment collant avec les anciens + plus lent versions de PHP.
D'autres causes pour Inattendu
[
les erreurs de syntaxeSi c'est pas le PHP incompatibilité de version, puis c'est souvent une simple faute de frappe ou de nouveaux arrivants de syntaxe erreur:
Vous ne pouvez pas utiliser tableau déclarations de propriété/expressions dans les classes, même pas en PHP 7.
Confusion
[
avec l'ouverture des accolades{
ou entre parenthèses(
est une commune de la surveillance.Ou encore:
Ou d'essayer de déréférencer des constantes (avant de PHP 5.6) sous la forme de tableaux:
Au moins PHP interprète qui
const
comme un nom de constante.Si vous signifiait pour accéder à une variable de tableau (ce qui est la cause typique ici), puis ajouter le leader
$
sigil - de sorte qu'il devient un$varname
.Que vous essayez d'utiliser la
global
mot clé sur un membre d'un tableau associatif. Ce n'est pas une syntaxe valide:Inattendu
]
de clôture crochetC'est un peu plus rare, mais il y a aussi la syntaxe des accidents avec la terminaison de la matrice de
]
support.Nouveau inadéquation avec
)
parenthèses ou}
accolades sont communs:Ou d'essayer de mettre fin à un tableau où il n'y a pas un:
Qui se produit souvent dans multi-ligne et imbriquée tableau déclarations.
Dans ce cas, utilisez votre IDE pour le support correspondant à trouver tout prématurée
]
tableau de fermeture. À tout le moins utiliser plus d'espacement et les retours à la ligne pour le réduire.Inattendu T_VARIABLE
Un "inattendu
T_VARIABLE
" signifie qu'il y a un littéral$variable
nom, qui ne rentre pas dans le courant de l'expression ou de la déclaration de la structure.Point-virgule manquant
Le plus couramment indique un point-virgule manquant dans la ligne précédente. Affectations de variables à la suite d'une déclaration sont un bon indicateur de l'endroit où regarder:
De concaténation de chaîne
Fréquemment mésaventure sont concaténations de chaîne oubliés
.
opérateur:Btw, vous devriez préférer chaîne d'interpolation (variables de base dans les guillemets) chaque fois que cela vous aide à la lisibilité. Ce qui permet d'éviter ces problèmes de syntaxe.
Manquant opérateurs d'expression
Bien sûr, le même problème peut se poser dans d'autres expressions, par exemple des opérations arithmétiques:
PHP ne peut pas deviner ici si la variable doit avoir été ajoutées, soustraites ou par rapport etc.
Listes
Même pour la syntaxe des listes, comme dans la gamme des populations, où l'analyseur indique également un prévu virgule
,
par exemple:Des fonctions ou des listes de paramètres:
De manière équivalente, voyez-vous cette avec
list
ouglobal
états, ou quand manque un;
point-virgule dans unfor
boucle.Déclarations de classe
Cette erreur de l'analyseur se produit également dans les déclarations de classe. Vous ne pouvez affecter des constantes statiques, pas des expressions. Ainsi, l'analyseur se plaint de variables comme les données:
Inégalée
}
fermeture des accolades peut en particulier conduire ici. Si une méthode est terminée trop tôt (utiliser la bonne indentation!), puis un errant variable est souvent égaré dans la déclaration de classe du corps.Variables d'après les identificateurs
Vous pouvez également n'avoir jamais une variable suivi d'un identificateur directement:
Btw, c'est un bon exemple où l'intention était d'utiliser les variables peut-être. Dans ce cas, une variable de recherche de propriété avec
$this->{"myFunc$VAR"}();
par exemple.Manque les parenthèses après les constructions de langage
Hâtive de frappe peut conduire à oublié une parenthèse ouvrante
pour
if
etfor
etforeach
états:Solution: ajouter le manque d'ouverture
(
entre la déclaration et variable.D'autre ne s'attend pas à des conditions
Solution: Supprimer les conditions de
else
ou de l'utilisationelseif
.Besoin de crochets de fermeture
Solution: Ajouter des parenthèses autour de
$var
.Invisible espaces
Comme mentionné dans le référence de réponse sur "Invisible errants Unicode" (comme un l'espace insécable), vous pouvez également voir cette erreur pour les code comme:
C'est assez répandue dans le début des fichiers et pour le copier /coller de code. Vérifier avec un hexeditor, si votre code n'est pas visuellement semblent contenir une syntaxe question.
Voir aussi
Inattendu T_CONSTANT_ENCAPSED_STRING
Inattendu T_ENCAPSED_AND_WHITESPACE
La quasi-noms
T_CONSTANT_ENCAPSED_STRING
etT_ENCAPSED_AND_WHITESPACE
reportez-vous à la cité"string"
littéraux.Ils sont utilisés dans des contextes différents, mais la syntaxe question sont tout à fait semblables. T_ENCAPSED... avertissements se produisent dans la double chaîne de caractères entre guillemets contexte, alors que T_CONSTANT... les chaînes de caractères sont souvent égarés en PHP expressions ou des énoncés.
Incorrect interpolation de variable
Et elle vient le plus souvent d'une erreur de PHP interpolation de variable:
Citant des tableaux des touches est un must en PHP contexte. Mais dans les chaînes entre guillemets doubles (ou HEREDOCs) ce qui est une erreur. L'analyseur se plaint du contenu unique cité
'string'
, parce qu'il attend généralement d'un littéral identifiant /clé.Plus précisément, il est valide pour utiliser PHP2 de style syntaxe simple à l'intérieur de guillemets doubles pour les références de tableau:
Tableaux imbriqués ou profonde, les références de l'objet exige toutefois la complexe bouclés expression de chaîne syntaxe:
Si vous ne savez pas, c'est généralement plus sûr d'utiliser. C'est même souvent considéré comme plus lisible. Et mieux IDEs réellement distinctes colorisation de syntaxe pour que.
Manque de concaténation
Si une chaîne de caractères qui suit une expression, mais il lui manque une concaténation ou d'un autre opérateur, vous verrez PHP se plaindre de la chaîne de caractères littérale:
Alors que c'est évident pour vous et moi, PHP ne peut tout simplement pas deviner que la chaîne était destiné à être annexé il.
Confusion chaîne de devis boîtiers
La même erreur de syntaxe se produit lorsque confondant les délimiteurs de chaînes de. Une chaîne a commencé par un seul
'
ou double"
citation se termine d'ailleurs par le même.Que l'exemple a commencé avec des guillemets doubles. Mais les guillemets doubles sont aussi destinées pour les attributs HTML. Destiné à l'opérateur de concaténation de l'intérieur est toutefois devenue interprétée comme faisant partie d'une deuxième chaîne de caractères entre guillemets simples.
C'est un bon exemple où vous ne devriez pas sortir de guillemets dans la première place. Au lieu de cela utilisez simplement bon
\"
s'échappe pour les attributs HTML citations:Alors que cela peut aussi conduire à la syntaxe de la confusion, toutes les meilleures IDEs/éditeurs de nouveau de l'aide par la colorisation de l'échappé citations différemment.
Manquant guillemet d'ouverture
De manière équivalente, sont oublié de l'ouverture de
"
/'
citations une recette pour les erreurs d'analyse:Ici la
', '
deviendrait un littéral de chaîne après un mot nu, quand de toute évidencelogin
était censé être un paramètre de chaîne.Tableau liste
Si vous manquez une
,
virgule dans un tableau création de bloc, l'analyseur va voir deux chaînes consécutives:Noter que la dernière ligne peut toujours contenir une virgule supplémentaire, mais la vue sur l'un entre eux, qui est impardonnable. Ce qui est difficile à découvrir sans coloration syntaxique.
Fonction des listes de paramètres
Même chose pour les appels de fonction:
Runaway chaînes
Une variation fréquente sont tout simplement oublié les terminateurs de chaîne:
Ici PHP se plaint de deux littéraux de chaîne directement à la suite les uns des autres. Mais la véritable cause est ouverte précédent chaîne de cours.
Voir aussi
Unexpected T_STRING
T_STRING
est un peu un abus de langage. Il ne fait pas référence à une cité"string"
. Cela signifie un raw identificateur a été rencontrée. Cela peut aller debare
mots pour les restes deCONSTANT
ou les noms de fonction, oublié non cotées chaînes, ou tout le texte.Mal cité des chaînes
Cette erreur de syntaxe est plus fréquente pour les mal cité de la chaîne de valeurs. Tout sans échappement et errants
"
ou'
devis formulaire invalide expression:La coloration syntaxique va faire de telles erreurs super évident. Il est important de se rappeler d'utiliser des barres obliques inverses pour échapper à
\"
guillemets, ou\'
des apostrophes en fonction de ce qui a été utilisé comme chaîne de boîtier."
guillemets.echo
/print
lignes au lieu de s'échapper dans et hors. Mieux encore envisager une HEREDOC section.Voir aussi Quelle est la différence entre la cité et entre guillemets chaînes de caractères en PHP?.
Unclosed chaînes
Si vous manquer une fermeture
"
une erreur de syntaxe se matérialise généralement plus tard. Un des intermédiaires de la chaîne va souvent de consommer un peu de code jusqu'à la prochaine prévue de la chaîne de valeur:Ce n'est pas seulement littérale
T_STRING
s qui l'analyseur peut contester ensuite. Un autre fréquentes variations est unInattendue " >'
pour les sociétés non cotées littérale HTML.Non-programmation de la chaîne de citations
Si vous copiez et collez code à partir d'un blog ou d'un site web, parfois vous retrouver avec du code non valide. Typographique des guillemets ne sont pas ce que PHP attend:
Typographie/guillemets sont des symboles Unicode. PHP traite comme de la partie attenante de texte alphanumérique. Par exemple
”these
est interprété comme une constante de l'identificateur. Mais le texte qui suit littérale est alors vu comme un mot nu/T_STRING par l'analyseur.Le point-virgule manquant; de nouveau
Si vous avez une indéterminé expression dans les lignes précédentes, toute déclaration suivante ou de la construction du langage obtient vu que les matières premières de l'identificateur:
PHP ne pouvez pas savoir si vous exécutez deux fonctions, l'une après l'autre, ou si vous signifiait pour multiplier leurs résultats, les ajouter, de les comparer, ou de faire fonctionner un seul
||
ou l'autre.Court balises ouvertes et
<?xml
les en-têtes dans les scripts PHPC'est plutôt rare. Mais si short_open_tags sont activées, vous ne pouvez pas commencer vos scripts PHP avec une déclaration XML:
PHP va voir le
<?
et de la récupérer pour lui-même. Il ne comprend pas ce que le parasitexml
était destinée. Elle peut être interprétée comme une constante. Mais leversion
sera considéré comme un littéral/constant. Et depuis, l'analyseur ne peut pas donner un sens à deux littéraux/valeurs sans une expression de l'opérateur entre les deux, ce sera un analyseur échec.Invisible des caractères Unicode
Un plus hideux cause d'erreurs de syntaxe sont en Unicode des symboles, tels que la l'espace insécable. PHP permet de caractères Unicode comme identificateur de noms. Si vous obtenez un T_STRING analyseur plainte pour totalement unsuspicious code comme:
Vous avez besoin de sortir un autre éditeur de texte. Ou un hexeditor même. Ce qui ressemble à la plaine des espaces et des retours à la ligne ici, peut contenir invisible constantes. Java Ide sont parfois inconscients de l'UTF-8 BOM de déformation à l'intérieur, espaces de largeur nulle, séparateurs de paragraphe, etc. Essayez de remodifier tout, supprimer l'espace et ajouter des espaces normaux dans.
Vous pouvez le réduire avec l'ajout de redondant
;
déclaration de séparateurs à chaque ligne de départ:L'extra
;
point-virgule ici vous permet de convertir le précédent personnage invisible dans une constante indéfinie de référence (expression que l'énoncé). Ce qui en retour rend PHP produire un avis utile.Le signe `$` manquant devant les noms de variables
Les Variables en PHP sont représentées par un signe dollar, suivi du nom de la variable.
Le signe dollar (
$
) est un sigil qui marque l'identifiant comme un nom d'une variable. Sans ce sceau, l'identificateur peut être un langue de mots clés ou un constant.C'est une erreur courante lorsque le code PHP a été "traduit" de code écrit dans une autre langue (C, Java, JavaScript, etc.). Dans de tels cas, une déclaration de la variable type (lorsque le code original a été écrit dans un langage qui utilise des variables de type) pourrait également se faufiler et de produire cette erreur.
Échappé Guillemets
Si vous utilisez
\
dans une chaîne, il a une signification particulière. Ceci est appelé un "Caractère D'Échappement" et, normalement, indique à l'analyseur de prendre le caractère suivant à la lettre.Exemple:
echo 'Jim said \'Hello\'';
imprimeJim said 'hello'
Si vous échappez au cours de clôture d'une chaîne, le cours de clôture sera pris à la lettre et pas comme prévu, c'est à dire comme une version imprimable des devis dans le cadre de la chaîne et ne pas fermer la chaîne. Cela permettra de montrer que l'erreur d'analyse de la souvent après l'ouverture de la chaîne suivante ou à la fin du script.
Très commune erreur lors de spécifier des chemins d'accès dans Windows:
"C:\xampp\htdocs\"
est faux. Vous avez besoin"C:\\xampp\\htdocs\\"
.Inattendu
(
Ouverture de parenthèses suivent généralement les constructions de langage tels que
if
/foreach
/for
/array
/list
ou de démarrer une expression arithmétique. Ils sont syntaxiquement incorrectes après"strings"
, un précédent()
, un seul$
, et dans certains typique de la déclaration de contextes.Déclaration de fonction des paramètres
Une rare apparition de cette erreur est essayez d'utiliser des expressions en tant que par défaut les paramètres de la fonction. Ce n'est pas pris en charge, même dans PHP7:
Paramètres dans une déclaration de fonction ne peut être littérale des valeurs ou des expressions constantes. À la différence pour les appels de fonction, où vous pouvez librement utiliser
whatever(1+something()*2)
etc.Des propriétés de la classe par défaut
Même chose pour membre de la classe des déclarations, où seul littéral/les valeurs des constantes sont autorisés, pas des expressions:
Mettre de telles choses dans le constructeur.
Voir aussi Pourquoi ne pas PHP attributs permettent de fonctions?
Encore une fois, notez que PHP 7 permet seulement
var $xy = 1 + 2 +3;
expressions constantes là.La syntaxe JavaScript en PHP
À l'aide de JavaScript ou la syntaxe jQuery ne fonctionne pas en PHP pour des raisons évidentes:
Lorsque cela se produit, il indique généralement une indéterminé précédent chaîne; et littérale
<script>
sections qui s'infiltre dans le code PHP contexte.isset(()), vide, clé, à côté, le courant
Les deux
isset()
etempty()
sont de langue built-ins, pas de fonctions. Ils besoin d'accéder à une variable directement. Si vous avez, par inadvertance, ajouter une paire de parenthèses en trop, vous devez alors créer une expression cependant:La même chose s'applique à toute construction du langage qui nécessite implicite nom de la variable d'accès. Ces built-ins font partie de la langue, de la grammaire, par conséquent, ne pas permettre décoratif supplémentaire entre parenthèses.
Au niveau de l'utilisateur fonctions qui nécessitent une variable de référence, mais un résultat de l'expression passée conduire à des erreurs d'exécution à la place.
Inattendu
)
Absent paramètre de la fonction
Vous ne pouvez pas avoir égaré des virgules dernier dans un appel de fonction. PHP s'attend à une valeur de y et ainsi se plaint d'une clôture anticipée,
)
parenthèse.Une virgule n'est autorisé que dans
array()
oulist()
constructions.Inachevé expressions
Si vous oubliez quelque chose dans une expression arithmétique, alors l'analyseur donne. Car comment faut-il interpréter que:
Et si vous avez oublié la clôture
)
même, alors vous avez une plainte au sujet de l'inattendu point-virgule à la place.Foreach comme
constant
Pour oublié variable
$
préfixes dans les instructions de contrôle vous verrez:PHP ici parfois, vous dit-il prévu un
::
à la place. Parce qu'une classe::$variable pourrait avoir satisfait aux attendus $variable expression..Inattendu
{
Accolades
{
et}
placez des blocs de code. Et les erreurs de syntaxe sur eux indiquent généralement certains impropre de le dénommer ainsi de nidification.Inégalée sous-expressions dans un
if
Plus couramment déséquilibrée
(
et)
sont la cause si l'analyseur se plaint de l'ouverture bouclés{
apparaissant trop tôt. Un exemple simple:Compter vos parens ou de l'utilisation d'un IDE qui vous aide à cela. Aussi, ne pas écrire du code sans espaces. La lisibilité compte.
{ et } dans le contexte d'expression
Vous ne pouvez pas utiliser d'accolades dans les expressions. Si vous confondez les parenthèses et les curlys, il n'est pas conforme à la langue grammaire:
Il y a quelques exceptions pour l'identificateur de la construction, telles que la portée de la variable
${references}
.Les variables ou bouclés var expressions
C'est assez rare. Mais on peut aussi avoir
{
et}
analyseur de plaintes pour la variable complexe expressions:Si il ya une probabilité plus élevée pour un imprévu
}
dans de tels contextes.Inattendu
}
Lors de l'obtention d'un "inattendu
}
" erreur, vous avez la plupart du temps fermée d'un bloc de code trop tôt.Dernière instruction dans un bloc de code
Il peut arriver pour n'importe quel non de l'expression.
Et si la dernière ligne d'une fonction/bloc de code manque de suivi
;
point-virgule:Ici l'analyseur ne peut pas savoir si vous en avez peut-être toujours voulu ajouter
+ 25;
pour le résultat de la fonction ou quelque chose d'autre.Invalide bloc de nidification /Oublié
{
Que vous pouvez parfois voir cette erreur de l'analyseur lorsqu'un bloc de code a été
}
fermé trop tôt, ou vous avez oublié une ouverture{
même:Dans l'extrait ci-dessus la
if
n'ont pas une ouverture{
accolade. Ainsi, la fermeture}
celui ci-dessous est devenu redondant. Et donc la prochaine fermeture}
, qui était prévu pour la fonction, n'a pas été associatable à l'origine de l'ouverture de{
accolade.De telles erreurs sont encore plus difficiles à trouver sans un bon code de l'indentation. Utilisez un environnement de développement et le support correspondant.
Inattendu
{
, s'attendant à(
Des constructions d'un langage qui exigent une condition ou déclaration de l'en-tête et un bloc de code va provoquer cette erreur.
Listes de paramètres
Par exemple mal déclarées comme appartenant à des fonctions sans paramètre de la liste ne sont pas autorisés:
De contrôle des conditions
Et vous ne pouvez pas même avoir une
if
sans condition.Qui n'a pas de sens, évidemment. La même chose pour les suspects habituels,
for
/foreach
,while
/do
, etc.Inattendu $fin
Lorsque PHP parle d'un "inattendu
$end
", cela signifie que votre code s'est terminée prématurément. (Le message est un peu trompeur, lorsque pris à la lettre. Ce n'est pas une variable nommée "$fin", comme c'est parfois assumé par les nouveaux arrivants. Il se réfère à la "fin de fichier", EOF.)C'est à peu près toujours manque un
}
accolade à proximité précédent blocs de code.De nouveau, à utiliser de façon appropriée en retrait pour éviter de tels problèmes.
Utiliser un IDE avec support correspondant, à savoir où l'
}
est mal.Il y a des raccourcis clavier dans la plupart des IDEs et des éditeurs de texte:
La plupart des IDEs aussi mettre en évidence correspondance des accolades, crochets et parenthèses.
Ce qui le rend assez facile à inspecter leur corrélation:
Indéterminé expressions
Et
Unexpected $end
syntaxe/analyseur d'erreur peut également se produire pour les intermédiaires des expressions ou des énoncés:$var = func(1,
?>
EOFDonc, regardez à la fin de scripts en premier. Une fuite
;
est souvent redondantes pour la dernière déclaration dans un script PHP. Mais vous devrait en avez un. Précisément parce qu'il se rétrécit de tels problèmes de syntaxe bas.En retrait HEREDOC marqueurs
Un autre événement s'affiche avec HEREDOC ou NOWDOC cordes. La résiliation de marqueur va ignoré avec de grands espaces, des tabulations, etc.:
Par conséquent, l'analyseur suppose la HEREDOC chaîne de poursuivre jusqu'à la fin du fichier (d'où "Unexpected $end"). À peu près tous IDEs et de la syntaxe en surbrillance des éditeurs de faire de cette évidente ou mettre en garde à ce sujet.
Échappé Guillemets
Si vous utilisez
\
dans une chaîne, il a une signification particulière. Ceci est appelé un "Caractère D'Échappement" et, normalement, indique à l'analyseur de prendre le caractère suivant à la lettre.Exemple:
echo 'Jim said \'Hello\'';
imprimeJim said 'hello'
Si vous échappez au cours de clôture d'une chaîne, le cours de clôture sera pris à la lettre et pas comme prévu, c'est à dire comme une version imprimable des devis dans le cadre de la chaîne et ne pas fermer la chaîne. Cela permettra de montrer que l'erreur d'analyse de la souvent après l'ouverture de la chaîne suivante ou à la fin du script.
Très commune erreur lors de spécifier des chemins d'accès dans Windows:
"C:\xampp\htdocs\"
est faux. Vous avez besoin"C:\\xampp\\htdocs\\"
.Syntaxe Alternative
Un peu plus rare, vous pouvez voir cette erreur de syntaxe lors de l'utilisation de la syntaxe alternative pour instruction/blocs de code dans les templates. À l'aide de
if:
etelse:
et un manqueendif;
par exemple.Voir aussi:
Inattendu T_IF
Inattendu T_ELSEIF
Inattendu T_ELSE
Inattendu T_ENDIF
Conditionnelle de blocs de contrôle
if
,elseif
etelse
suivre une structure simple. Lorsque vous rencontrez une erreur de syntaxe, il est probablement juste de bloc non valide de nidification → manquant{
accolades}
- ou un de trop.Manquant
{
ou}
due à une mauvaise indentationIncompatibles code entre accolades sont des communes de moins bien formaté le code tel que:
Si votre code ressemble à ça, repartir à zéro! Sinon, c'est irrécupérable, à vous ou à quelqu'un d'autre. Il n'y a pas de point de mettre en valeur ce sur l'internet pour obtenir de l'aide.
Vous ne serez en mesure de le réparer, si vous pouvez suivre visuellement la structure imbriquée et la relation de if/else conditions et leur
{
blocs de code}
. Utilisez votre IDE pour voir si ils sont tous jumelés.Double
}
}
ne sera pas seulement de fermer une succursale, mais un état antérieur de la structure. Donc bâton avec un style de codage; ne pas mélanger et assortir en imbriquée si/d'autre arbres.Outre la cohérence ici, il s'avère utile pour éviter les longs conditions trop. Utiliser des variables ou des fonctions pour éviter illisible
if
-expressions.IF
ne peut pas être utilisé dans des expressionsÉtonnamment fréquente de nouveaux arrivants erreur est d'essayer d'utiliser un
if
déclaration dans une expression, comme une instruction d'impression:Qui n'est pas valide, bien sûr.
Vous pouvez utiliser un conditionnel ternaire, mais attention à la lisibilité de l'impact.
Sinon briser la sortie des constructions: utiliser plusieurs
if
s etecho
s.Mieux encore, utilisez les variables temporaires, et le lieu de votre conditionnelles avant:
De définir des fonctions ou des méthodes de tels cas, souvent de sens que trop.
Blocs de contrôle n'est pas de retour "résultats"
Maintenant c'est moins fréquent, mais quelques codeurs même essayer de traiter
if
comme si elle pouvait retourner un résultat:Qui est structurellement identique à l'aide de
if
au sein d'une concaténation de chaîne /expression.Vous aurez à utiliser une assignation dans le bloc de code:
Sinon, le recours à un
?:
comparaison ternaire.Si Si
Vous ne peut pas imbriquer une
if
à l'intérieur d'une condition, soit:Qui est évidemment inutile, parce que le
and
(ouor
) permet déjà de chaînage des comparaisons.Forgotton
;
des points-virgulesUne fois de plus: Chaque bloc de contrôle doit être une déclaration. Si le code précédent, la pièce n'est pas terminée par un point-virgule, c'est une garantie d'erreur de syntaxe:
Btw, la dernière ligne d'un
{…}
bloc de code a besoin d'un point-virgule en trop.Point-virgule trop tôt
Maintenant, c'est sans doute tort de reprocher à un particulier style de codage, que ce piège est trop facile d'oublier:
Qui arrive plus souvent que vous ne pourriez l'imaginer.
if ()
expression;
il va exécuter un vide déclaration. Le;
devient un vide{}
de sa propre!{…}
bloc est donc détachée de laif
, et pourrait toujours courir.else
n'avait plus de rapport à uneif
construire,c'est pourquoi cela conduira à une Inattendue T_ELSE erreur de syntaxe.
Ce qui explique aussi un de la même manière subtile variation de cette erreur de syntaxe:
Où la
;
après le bloc de code{…}
met fin à l'ensemble de laif
construire, la dissociation de la
else
direction du point de vue syntaxique.Pas à l'aide de blocs de code
C'est syntaxiquement permis d'omettre les accolades
{
...}
pour les blocs de code dansif
/elseif
/else
branches. Qui, malheureusement, est un style de syntaxe très commun pour unversed codeurs. (Sous le faux ce était plus rapide à taper ou à lire).Cependant, c'est très probable que le voyage jusqu'à la syntaxe. Tôt ou tard, des instructions supplémentaires à trouver leur chemin dans le if/else branches:
Mais pour l'utilisation de blocs de code, vous n'ont à écrire
{
...}
comme tel!Else /Elseif dans le mauvais ordre
Une chose à rappeler est le ordre conditionnel, bien sûr.
Vous pouvez avoir autant de
elseif
s que vous voulez, maiselse
doit aller à la dernière. C'est juste la façon dont il est.Déclarations de classe
Comme mentionnés ci-dessus, vous ne pouvez pas avoir de contrôle énoncés dans une déclaration de classe:
Vous oublié une fonction définition, ou de la fermeture d'une
}
trop tôt dans de tels cas.Inattendu T_ELSEIF /T_ELSE
Lors du mélange de PHP et de HTML, la fermeture
}
pour unif/elseif
doit être dans le même bloc PHP<?php ?>
que la prochaineelseif/else
. Cela va générer une erreur que de la fermeture}
pour laif
doit faire partie de laelseif
:La forme correcte
<?php } elseif
:C'est plus ou moins une variation de la mauvaise indentation, probablement souvent basées sur un mauvais codage intentions.
Vous ne pouvez pas purée d'autres déclarations entre
if
etelseif
/else
structurelle des jetons:Soit ne peut se produire dans
{…}
de blocs de code, pas entre la structure de contrôle de jetons.if
etelse
branches.Et vous ne pouvez partie d'un if/else entre les différentes structures de contrôle:
Il n'y a pas de syntaxique de la relation entre les
if
etelse
. Leforeach
portée lexicale se termine à}
, donc il n'y a pas de point pour leif
structure pour continuer.T_ENDIF
Si inattendue T_ENDIF est plaint, vous êtes à l'aide de la syntaxe alternative de style
if:
⋯elseif:
⋯else:
⋯endif;
. Qui que vous devriez vraiment penser à deux fois.Un piège classique est déroutant de l'étrangement similaires
:
colon, pour un;
point-virgule. (Couvert de "point-Virgule trop tôt")Que l'indentation est plus difficile à repérer dans les fichiers de modèle, le plus lors de l'utilisation de la syntaxe alternative - c'est plausible votre
endif;
ne correspond à aucunif:
.À l'aide de
} endif;
est un doublé
if
-terminator.Tout en un "unexpected $end" est généralement le prix d'un oubli de fermeture
}
accolade.Affectation vs comparaison
Donc, ce n'est pas une erreur de syntaxe, mais vaut la peine de mentionner dans ce contexte:
Ce n'est pas un
==
/===
de comparaison, mais un=
cession. C'est assez subtil, et sera facilement conduire à certains utilisateurs d'désespérément de modifier toute condition blocs. Watch out pour les imprévus affectations de première whenver vous l'expérience d'une logique de la faute /misbeheviour.Inattendu T_IF
Inattendu T_FOREACH
Inattendu T_FOR
Inattendu T_WHILE
Inattendu T_DO
Inattendu T_ECHO
De contrôle des constructions telles que
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
ne peut être utilisé que de témoignages. Ils résident habituellement sur une ligne par eux-mêmes.Point-virgule; où vous à?
Assez universellement avez-vous manqué un point-virgule dans la ligne précédente si l'analyseur se plaint d'un contrôle de la déclaration:
Solution: regardez dans la ligne précédente; ajouter un point-virgule.
Déclarations de classe
Un autre endroit où cela se produit est dans les déclarations de classe. Dans la section de classe, vous pouvez seulement de la liste des biens de l'initialisation et de la méthode des sections. Pas de code peuvent y résider.
De telles erreurs de syntaxe souvent matérialisent de manière incorrecte imbriquée
{
et}
. En particulier lors de la fonction des blocs de code est fermé trop tôt.Déclarations dans le contexte d'expression
La plupart des constructions de langage peut seulement être utilisés comme des déclarations. Ils ne sont pas destinés à être placés à l'intérieur d'autres expressions:
De même ne peut-on pas utiliser un
if
dans des chaînes, des expressions mathématiques ou ailleurs:Pour l'incorporation de la
if
des conditions dans une expression spécifiquement, vous souhaitez utiliser un?:
ternaire de l'évaluation.La même chose s'applique à
for
,while
,global
,echo
et à une moindre mesure,list
.Alors que
print()
est un langage intégré qui peut être utilisé dans le contexte d'expression. (Mais rarement de sens.)Mots clés réservés comme des identificateurs
Vous aussi vous ne pouvez pas utiliser
do
ouif
et d'autres constructions de langage pour les fonctions définies par l'utilisateur ou les noms de classe. (Peut-être dans PHP7. Mais même alors, il ne serait pas être recommandé.)Inattendu T_IS_EQUAL
Inattendu T_IS_GREATER_OR_EQUAL
Inattendu T_IS_IDENTICAL
Inattendu T_IS_NOT_EQUAL
Inattendu T_IS_NOT_IDENTICAL
Inattendu T_IS_SMALLER_OR_EQUAL
Inattendu
<
Inattendu
>
Opérateurs de comparaison tels que
==
,>=
,===
,!=
,<>
,!==
et<=
ou<
et>
la plupart devraient être utilisées dans des expressions telles queif
expressions. Si l'analyseur de se plaindre, alors cela signifie souvent incorrecte à éplucher ou non(
)
parenthèses autour d'eux.Parens groupement
En particulier pour
if
états comparaisons multiples, vous devez prendre soin de calculer correctement la l'ouverture et la fermeture de la parenthèse:Ici la
if
état ici a déjà été résilié par le)
Une fois que vos comparaisons deviennent suffisamment complexe, il est souvent utile de les diviser en de multiples et imbriquées
if
constructions plutôt.isset() de la purée de comparer
Une commune des nouveaux arrivants est pitfal est d'essayer de combiner
isset()
ouempty()
avec des comparaisons:Ou encore:
Ce n'est pas logique de PHP, car
isset
etempty
sont des constructions d'un langage qui n'acceptent que les noms de variables. Il n'est pas judicieux de comparer le résultat, car la sortie est uniquement/est déjà un booléen.Confusion
>=
plus-ou-égal avec=>
de la matrice de l'opérateurLes deux opérateurs de ressembler à peu près semblables, de sorte qu'ils parfois se mélangent:
Vous avez seulement besoin de se rappeler que cet opérateur de comparaison est appelé "plus de ou l'égalité des" pour obtenir la droite.
Voir aussi: Si la déclaration de la structure en PHP
Rien à comparer à l'
Vous aussi vous ne pouvez pas combiner les deux comparaisons si elles portent le même nom de variable:
PHP ne peut pas en déduire que vous destiné à comparer la première variable de nouveau. Les Expressions sont généralement couplés selon la priorité de l'opérateur, donc, le temps que le
<
est vu, il y avait seulement un résultat booléen de gauche à partir de la variable d'origine.Voir aussi: inattendu T_IS_SMALLER_OR_EQUAL
De comparaison de chaînes
Vous ne pouvez pas comparer une variable avec une ligne d'opérateurs:
Ce doit être décomposée en deux comparaisons, chaque contre
$x
.C'est en fait plus un cas de la liste noire des expressions (en raison de l'équivalent de l'opérateur associativité). C'est syntaxiquement valide dans un peu de style C langues, mais PHP ne serait pas l'interpréter comme prévu comparaison de la chaîne soit.
Inattendu
>
Inattendu
<
Le plus de
>
ou moins de<
les opérateurs n'ont pas une coutumeT_XXX
tokenizer nom. Et tandis qu'ils peuvent être déplacés comme tous les ils les autres, vous le plus souvent à l'analyseur de se plaindre à leur sujet pour le mal cité de cordes et de purée de HTML:Cela équivaut à une chaîne de
"<a href='z"
d'être comparé>
à une constante littéraleHello
et puis un autre<
comparaison. Ou c'est du moins la façon dont PHP voit. La cause réelle et la syntaxe erreur était prématuré de la chaîne"
résiliation.Il n'est également pas possible de nid PHP balises de début:
Voir aussi:
Inattendu '?'
Si vous essayez d'utiliser la valeur null coalescence opérateur
??
dans une version de PHP antérieures à la version 7, vous obtiendrez cette erreur.Inattendu '?', attend variable
Une erreur similaire peut se produire pour les types nullables, comme dans:
Qui indique une ancienne version de PHP utilisée (soit la version CLI
php -v
ou le serveur web liésphpinfo();
).Inattendu T_LNUMBER
Le jeton
T_LNUMBER
fait référence à un "long" /nombre.Des noms de variables invalides
En PHP, et la plupart des autres langages de programmation, les variables ne peut pas commencer par un chiffre. Le premier caractère doit être alphabétique ou un trait de soulignement.
Assez souvent vient pour l'utilisation de
preg_replace
-des espaces réservés"$1"
en PHP contexte:Où la fonction de rappel doit avoir été cité. (Maintenant le
/e
regex drapeau a été désapprouvée. Mais il est parfois encore utilisée à mauvais escientpreg_replace_callback
fonctions.)Le même identifiant contrainte s'applique à les propriétés de l'objet, btw.
Tandis que le tokenizer/analyseur ne permettent pas un littéral
$1
comme nom de variable, un pourrait utilisation${1}
ou${"1"}
. Qui est syntaxique, solution de contournement pour les non-standard identifiants. (Il est préférable de penser que c'est un local de champ de recherche. Mais en général: préférez la plaine des tableaux pour de tels cas!)De manière amusante, mais il n'est pas recommandé, PHPs analyseur permet Unicode identificateurs, tels que
$➊
serait valide. (Contrairement à un littéral1
).Errants entrée de tableau
Inattendu de la longue peut également se produire pour tableau déclarations - lorsque manquant
,
des virgules:Ou même des appels de fonction et déclarations, et autres constructions:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Donc en général il y a un de
;
ou,
manque de séparation des listes ou des expressions.Mal cité HTML
Et encore, mal cité des chaînes sont une source fréquente de parasites numéros:
De tels cas devraient être traités plus ou moins comme Unexpected T_STRING erreurs.
Autres identificateurs
Ni les fonctions, les classes, ni les espaces de noms peut être nommé début avec un nombre soit:
Peu près le même que pour les noms de variables.
Inattendu '='
Cela peut être causé par la présence de caractères non valides dans un nom de variable. Des noms de Variables doit suivre ces règles:
Inattendu "continuer" (T_CONTINUE)
continue
est une déclaration (comme pour, ou si) et doivent apparaître de manière autonome. Il ne peut pas être utilisé comme une partie d'une expression. En partie parce que poursuivre ne retourne pas une valeur, mais dans une expression chaque sous-expression doit entraîner une certaine valeur, de sorte que l'ensemble de l'expression des résultats en une valeur. C'est la différence entre une déclaration et une expression.Qui signifie
continue
ne peut pas être utilisé dans un ternaire déclaration ou de tout état qui nécessite une valeur de retour.Inattendu "pause" (T_BREAK)
En va de même pour
break;
de cours. Il n'est pas utilisable dans le contexte d'expression, mais d'un strict énoncé (au même niveau queforeach
ou unif
bloc).Inattendu de "retour" (T_RETURN)
Maintenant, ce pourrait être plus surprenant pour les
return
, mais c'est également à seulement un bloc de niveau déclaration. Elle retourne une valeur (ou NULLE) à la hausse de la portée/fonction, mais il n'évalue pas comme l'expression elle-même. → C'est: il n'y a pas lieu de le fairereturn(return(false);;
Inattendue "fintantque' (T_ENDWHILE)
La syntaxe est à l'aide d'un point - virgule, si il n'y a pas de colon de l'erreur ci-dessus se produisent.
L'alternative à cette syntaxe est à l'aide d'accolades:
http://php.net/manual/en/control-structures.while.php
Un message d'erreur qui commence
Parse error: syntax error, unexpected ':'
peut être causée par erreur l'écriture d'une classe statique de référenceClass::$Variable
commeClass:$Variable
.