PHPの解析/構文エラーとその解決方法?
誰もが構文エラーに遭遇する。経験豊富なプログラマーでさえタイプミスをする。新人にとって、それは学習プロセスの一部です。しかし、次のようなエラーメッセージを解釈するのは簡単です: PHP Parse error: syntax error, unexpected '{' in index.php on line 20. 予期しないシンボルが本当の原因とは限りません。しかし、行番号から、どこから探し始めるべきかの大まかな見当がつきます。 常にコードコンテキストを見てください。構文の間違いは、多くの場合、言及されたまたは前のコード行に隠れています。マニュアルの構文例と自分のコードを比較してください。 すべてのケースが一致するわけではありません。しかし、シンタックスミスを解決するための一般的なステップがいくつかあります。 このリファレンスには、よくある落とし穴がまとめられています:
- 予期しないT_STRING](https://stackoverflow.com/a/18092277)
- 予期しないT_VARIABLE
予期しない '$varname' (T_VARIABLE)](https://stackoverflow.com/a/18092267) - 予期しないT_CONSTANT_ENCAPSED_STRING
予期しないT_ENCAPSED_AND_WHITESPACE](https://stackoverflow.com/a/18092288) - 予期せぬ$end](https://stackoverflow.com/questions/18050071/php-parse-syntax-errors-and-how-to-solve-them#29500670)
- 予期せぬT_FUNCTION](https://stackoverflow.com/questions/3723748/php-version-5-2-14-parse-error-syntax-error-unexpected-t-function-expecting)...
- 予期しない
{
Unexpected}
Unexpected(
Unexpected)
](https://stackoverflow.com/a/18092308) - 予期せぬ
[
Unexpected]
](https://stackoverflow.com/a/29505827) - 予期せぬT_IF
予期せぬT_FOREACH
予期せぬT_FOR
予期せぬT_WHILE
予期せぬT_DO
予期せぬT_PRINT
予期せぬT_ECHO](https://stackoverflow.com/a/18092318) - 予期せぬT_LNUMBER](//stackoverflow.com/a/47202089)
- 予期せぬ ?](//stackoverflow.com/a/48670368)
- 予期しない継続(T_CONTINUE)
予期しない継続(T_BREAK)
予期しない継続(T_RETURN)](//stackoverflow.com/a/51786865) - 予期しない '='](//stackoverflow.com/a/53037930)
- 予期しないT_INLINE_HTML](https://stackoverflow.com/questions/4934754/t-inline-html-whats-wrong-with-this)...
- 予期しないT_PAAMAYIM_NEKUDOTAYIM](https://stackoverflow.com/questions/1966010/what-does-this-mean-parse-error-syntax-error-unexpected-t-paamayim-nekudotay)...
- 予期しないT_OBJECT_OPERATOR](https://stackoverflow.com/questions/3990212/help-with-this-error-message-unexpected-t-object-operator)...
- 予期せぬT_DOUBLE_ARROW](https://stackoverflow.com/questions/2622624/parse-error-syntax-error-unexpected-t-double-arrow-php)...
613
17
構文エラーとは?
PHPは、[C-style][1] および [imperative][2] プログラミング言語に属します。PHPには厳格な文法規則があり、誤った記号や識別子に遭遇した場合に、 それを回復することはできません。コーディングの意図を推測することはできません。 関数定義構文抽象][3]。
最も重要なヒント
常にできる基本的な注意事項がいくつかあります:
パーサーエラーの解釈方法
典型的な構文エラーメッセージはこうです: 構文エラー: 構文エラー、予期しない T_STRING, expected '
;
' in *file.php on line 217. これは、構文ミスの可能な場所をリストしています。言及されたファイル名と行番号を参照してください。 T_STRING`のような[moniker][7]は、パーサー/トークナイザーが最終的に処理できなかったシンボルを説明します。しかし、これが構文ミスの原因とは限りません。 前のコード行**も調べることが重要です。多くの場合、構文エラーは以前に起こった災難にすぎません。エラー行番号は、パーサーが最終的に処理をあきらめた場所にすぎません。構文エラーの解決
構文エラーを絞り込んで修正する方法はたくさんあります。
;
のセミコロンが前の行の行末/ステートメントで欠落しています。(少なくとも文体の観点からは )}
が正しく閉じられていなかったり入れ子になっていたりする場合は、 ソースコードのさらに上まで調査する必要があるかもしれません。それを単純化するために、適切な コード・インデント を使用してください。+-*/.
も異なる色にする。そうでないと、間違った文脈になってしまうかもしれません。"
や'
が欠けています。++
、--
、括弧がなければ、演算子は単独で存在する。2つの文字列や識別子が直接隣り合っているのは、ほとんどの文脈で正しくありません。if
ステートメントを個別のif
条件や入れ子のif
条件に分割する。?しかし、すべての場合において可読性を向上させるものではありません。未熟なうちは、プレーンな
if` 文を使うことをお勧めします。if:
/elseif:
/endif;
)はテンプレートでは一般的ですが、通常の{
code}
ブロックよりも間違いなく簡単ではありません。;
が見つからない。 -"や
'`の文字列引用符の不一致や、引用符のエスケープされていない文字列。.
の連結。(
括弧)
.報告された行の括弧を数えてください。その数は同じですか?差分
をいつでも見ることができる。構文の問題が何なのかを知るためのヒントになるかもしれません。このトピックは完全に議論されすぎている/複雑すぎると思います。 IDEを使用することは、構文エラーを完全に回避するための方法です。 IDEなしで作業することは、専門家ではないとも言えます。 なぜ? 最新のIDEは、入力するすべての文字の後に構文をチェックするためです。 コーディングすると、行全体が赤に変わり、大きな警告通知で構文エラーの正確なタイプと正確な位置が表示される場合は、別のソリューションを検索する必要はまったくありません。
構文チェックIDEを使用するということは、次のことを意味します。
入力時に正しく表示されるからといって、(効果的に)構文エラーに二度と遭遇することはありません。 真剣に。。
構文チェック付きの優れたIDE(それらはすべてLinux、Windows、Macで使用できます):。
1。 NetBeans[無料]。 2。 PHPStorm[$ 199 USD]。 3。 EclipsePHPプラグイン[無料]。 4。 Sublime$ 80 USD。
予期しない
[
。最近では、予期しない
[
配列ブラケットが古いPHPバージョンで一般的に見られます。 短い配列構文は、PHP > = 5.4 以降で使用できます。 古いインストールはarray()
のみをサポートします。同様に、配列関数の結果の逆参照は、古いPHPバージョンでは使用できません。
参照-このエラーはPHPで何を意味しますか? -「構文エラー、予期しない
\ [
]は、最も一般的で実用的な回避策を示しています。ただし、PHPのインストールをアップグレードするだけの方が常に優れています。 共有Webホスティングプランの場合、最初の調査(例:.
SetHandler php56-fcgi
を使用して、新しいランタイムを有効にできます。参照:
ところで、古い+遅いPHPバージョンに本当に固執している場合は、プリプロセッサとPHP 5.4構文ダウンコンバーターもあります。
予期しない
[
構文エラーの他の原因。PHPバージョンの不一致でない場合、多くの場合、プレーンタイポまたは新規参入者の構文の誤りです。
PHP& nbsp; 7でも、クラスの配列プロパティ宣言/式を使用できません。
[
を開く中括 ⁇{
または括 ⁇(
は一般的な見落としです。または:
*または、定数(PHP 5.6より前)を配列として逆参照しようとしています。
*連想配列のメンバーで「グローバル」キーワードを使用しようとしています。 これは有効な構文ではありません。
< br />。予期しない
]
閉じる角括 ⁇ 。これはややまれですが、終了配列
]
ブラケットによる構文事故もあります。*再び
)
括 ⁇ または}
中括 ⁇ との不一致が一般的です。*または、配列がない配列を終了しようとしています。
想定外のT_VARIABLE
予期しない
T_VARIABLE
"は、現在の式やステートメントの構造に合わない$variable
というリテラル名があることを意味します。![意図的に抽象的/不正確な演算子+$変数ダイアグラム][1]。
Missing semicolon
。
予期しないT_CONSTANT_ENCAPSED_STRING
予期しないT_ENCAPSED_AND_WHITESPACE。
扱いにくい名前
T_CONSTANT_ENCAPSED_STRING
およびT_ENCAPSED_AND_WHITESPACE
は、引用された"string"
literals を指します。それらはさまざまなコンテキストで使用されますが、構文の問題は非常に似ています。 T_ENCAPSED ... 警告は二重引用符で囲まれた文字列コンテキストで発生します。一方、 T_CONSTANT ... 文字列は、多くの場合、プレーンなPHP式またはステートメントで迷っています。
1。 < h3>不正な変数補間< / h3>。
2。 < h3>連結不足< / h3>。
3。 < h3>文字列引用エンクロージャの混乱< / h3>。
4。 < h3>開封の引用が欠落< / h3>。
5。 < h3>配列リスト< / h3>。
6。 < h3>関数パラメーターリスト< / h3>。
7。 < h3>暴走弦< / h3>。
こちらもご覧ください。
想定外のT_STRING
T_STRING
は少し誤用です。引用符で囲まれた
"string"を指すのではない。これは生の識別子に遭遇したことを意味する。これは、
bareな単語から、
CONSTANT`や関数名の残り、忘れられた引用符で囲まれていない文字列、またはプレーンテキストに及ぶ可能性がある。引用符で囲まれていない文字列'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) が発生することもあります。
ノンプログラミング文字列引用符
予期しない
(
。括 ⁇ を開くことは通常、「if
/
foreach/
for/
array/
list」などの言語構成に従うか、算術式を開始します。 それらは、「strings」、以前の「()」、孤独な「$」の後、およびいくつかの典型的な宣言のコンテキストでは構文的に正しくありません。1。 < h3>関数宣言パラメーター< / h3>。
2。 < h3>クラスプロパティのデフォルト< / h3>。
3。 < h3> PHPのJavaScript構文< / h3>。
4。 < h3> isset(())、空、キー、次、現在< / h3>。
。
予期しない
)
。1。 < h3>不在関数パラメーター< / h3>。
2。 < h3>未完成の式< / h3>。
3。 < h3>
constant< / code>としてのフォーラック< / h3>。
。
予期しない
{
。巻きブレース
{
および}
はコードブロックを囲みます。 そして、それらに関する構文エラーは通常、いくつかのincorrecネストを示します。1。 < h3>
if< / code>での一致しないサブ式< / h3>。
2。 < h3> {および}式コンテキスト< / h3>。
3。 < h3>変数または巻き毛の表現< / h3>。
。
予期しない
}
。「予期しない
}
」エラーが発生した場合は、コードブロックを早すぎて閉じています。1。 < h3>コードブロックの最後のステートメント< / h3>。
2。 < h3>無効なブロックネスト/忘れられた
{< / code> < / h3>。
。
予期しない
{
、期待(
。条件/宣言ヘッダーおよびを必要とする言語構成は、コードブロックがこのエラーをトリガーします。
1。 < h3>パラメータリスト< / h3>。
2。 < h3>コントロールステートメントの条件< / h3>。
これは意味がありません。 通常の容疑者についても同じことが、「for
/
foreach、
while/
do`などです。予期しないT_IF
。
予期しないT_ELSEIF
。
予期しないT_ELSE
。
予期しないT_ENDIF。
< / h2>。
条件付きコントロールブロック「if」、「elseif」、「else」は単純な構造に従います。 構文エラーが発生した場合は、おそらく無効なブロックネスト→
{
curly braces}
が欠落しているか、または1つ多すぎます。。![ここに画像の説明を入力してください](https://i.stack.imgur.com/uF6Yq.gif。)。
1。 < h3>
{< / code>がありません。または
}< / code>インデントが正しくないため< / h3>。
2。 < h3>
IF< / code>式では使用できません< / h3>。
3。 < h3>忘れられた
< / code>セミコロン< / h3>。
4。 < h3>セミコロンが早すぎる< / h3>。
5。 < h3>コードブロックを使用しない< / h3>。
6。 < h3>その他/ Elseifの順序が間違っています< / h3>。
7。 < h3>クラス宣言< / h3>。
8。 < h3>予期しないT_ELSEIF / T_ELSE< / h3>。
9。 < h3> T_ENDIF< / h3>。
10。 < h3>割り当て対. 比較< / h3>。
予期しない$ end。
PHPが「予期しない
$ end
」について話すとき、それはあなたのコードが時期 ⁇ 早に終わったことを意味します。 (メッセージは文字通りとられると少し誤解を招くものです。 新規参入者が想定するように、「$ end」という名前の変数についてではありません。 「ファイルの終わり」、 EOF< / kbd>を指します。)。これは、先行するコードブロックを閉じるための欠落している
}
カーリーブレースについて、常に**かなりです。*繰り返しになりますが、そのような問題を回避するには、適切なインデントを使用してください。
*ブラケットが一致するIDEを使用して、「}」がどこに間違っているかを確認します。 ほとんどのIDEとテキストエディターにはキーボードショートカットがあります。
ほとんどのIDEは、ブレース、ブラケット、括 ⁇ に一致するハイライトも備えています。 これにより、相関関係を簡単に検査できます。
[IDEでのブラケットマッチング][1]。!
終了していない式。
また、「予期しない$ end」構文/パーサーエラーは、終了していない式やステートメントでも発生する可能性があります。
$ var = func(1、
。?>
EOF< / kbd>。まず、スクリプトの最後を見てください。 末尾の
;
は、多くの場合、PHPスクリプトの最後のステートメントに対して冗長です。 しかし、あなたはそれを持っているべきです。 まさにそれがそのような構文の問題を絞り込むからです。インデントされたHEREDOCマーカー。
[HEREDOCまたはNOWDOC][2]文字列で別の一般的な発生が表示されます。 終了マーカーは、先行スペース、タブなどで無視されます。:
。 予期しないT_FOREACH
。 予期しないT_FOR
。 予期しないT_WHILE
。 予期しないT_DO
。 予期しないT_ECHO。 < / h2>。
「if」、「foreach」、「for」、「while」、「list」、「global」、「return」、「do」、「print」、「echo」などの制御構成は、ステートメントとしてのみ使用できます。 彼らは通常、一人で列に並んでいます。
1。 < h3>セミコロン;どこにいるの? < / h3>。
2。 < h3>クラス宣言< / h3>。
3。 < h3>式コンテキストのステートメント< / h3>。
4。 < h3>識別子として予約されたキーワード< / h3>。
。 予期しないT_IS_GREATER_OR_EQUAL
。 予期しないT_IS_IDENTICAL
。 予期しないT_IS_NOT_EQUAL
。 予期しないT_IS_NOT_IDENTICAL
。 予期しないT_IS_SMALLER_OR_EQUAL
。 予期しない
& lt;< / code>
。 予期しない
& gt;< / code>。 < / h2>。
==
、> =
、===
、などの比較演算子。!=
、`、
。!==および
< =または
<および
>は、主に
if`式などの式でのみ使用する必要があります。 パーサーがそれらについて不満を言う場合、それはしばしばそれらの周りの誤ったペアリングまたは不一致の「( ``)」の親を意味します。1。 < h3> Parensグループ化< / h3>。
2。 < h3> isset()を比較< / h3>でマッシュ。
3。 < h3>
& gt; =< / code>との融合
=& &&&&&&&&&&>配列演算子< / h3>。
4。 < h3>比較するものはありません< / h3>。
5。 < h3>予期しない& gt;< /コード>
予期しない
& lt;< / code>< / h3>。
参照:
-https://stackoverflow.com/questions/4593505/php-unexpected-t-is-not-equal-error。 -https://stackoverflow.com/questions/14538481/syntax-error-unexpected-t-is-equal。 -https://stackoverflow.com/questions/17239090/syntax-error-on-return-statement。 -http://forums.phpfreaks.com/topic/96891-parse-error-syntax-error-unexpected-t-is-not-identical-expecting-or/。
予期しない '?'。
nullコールセーシング演算子を使用しようとしている場合
??
PHP 7より前のバージョンのPHPでは、このエラーが発生します。予期しない '?'、変数を期待しています。
次のように、無効なタイプでも同様のエラーが発生する可能性があります。
これは、使用されている古いPHPバージョンを示しています(CLIバージョン
php -v
またはWebサーバーが1つのphpinfo();
)をバインドしました)。予期しないT_LNUMBER。
トークン「T_LNUMBER」は「長い」/番号を指します。
1。 < h3>無効な変数名< / h3>。
*。!
preg_replace
-placebolders"$ 1"を使用するためにかなり頻繁に[comes up](https://stackoverflow.com/questions/9571559/syntax-error-unexpected-t-lnumber-expecting-t-variable-or)
'
PHPコンテキストでは `。コールバックが引用されているはずです。 (現在、「/ e」正規表現フラグは非推奨になっています。 ただし、「preg_replace_callback」関数ではまだ誤用されている場合があります。)。
*同じ識別子制約がオブジェクトプロパティに適用されます。
*トークナイザー/パーサーでは、文字通りの「$ 1」を変数名として許可していませんが、「$ {{{1}}}」または「$ {"1"}」を使用することができます。 これは、非標準識別子の構文回避策です。 (ローカルスコープの検索と考えるのが最善です。 しかし、一般的に:そのような場合はプレーンアレイを好みます。!)。
*面白いですが、あまり推奨されていませんが、PHPパーサーはUnicode識別子を許可します。
$ ⁇
が有効になるようなもの。 (文字通りの「1」とは異なり)。2。 < h3>ストレイアレイエントリ< / h3>。
配列宣言にも予期しない長い発生する可能性があります-
、
commas:または同様に、関数呼び出しと宣言、およびその他の構成:
3。 < h3>誤って引用されたHTML< / h3>。
4。 < h3>その他の識別子< / h3>。
予期しない '='。
これは、変数名に無効な文字が含まれていることが原因です。 変数名は、次のルールに従う必要があります。
予期しない「継続」(T_CONTINUE)。
continue
はステートメント(for、ifなど)であり、スタンドアロンで表示する必要があります。 表現の一部として使用することはできません。 continueが値を返さないという理由もありますが、式ではすべてのサブ式がある程度の値になる必要があるため、式全体が値になります。 それがステートメントと表現の違いです。つまり、「継続」は、3項ステートメントまたは戻り値を必要とするステートメントでは使用できません。
予期しない「ブレイク」(T_BREAK)。
もちろん「休憩」についても同様です。 また、式のコンテキストでは使用できませんが、厳密なステートメント(「foreach」または「if」ブロックと同じレベル)です。
予期しない「返品」(T_RETURN)。
これは「戻る」のほうが意外かもしれませんが、それは単なるブロックレベルのステートメントでもあります。 値(またはNULL)をより高いスコープ/関数に返しますが、式自体としては評価しません。 →つまり、「return(return(false);;」を実行しても意味がありません。
予期しない「終わり」(T_ENDWHILE)##。
構文はコロンを使用しています-コロンがない場合、上記のエラーが発生します。
この構文の代替は、巻き毛ブラケットを使用することです。
http://php.net/manual/en/control-structures.while.php。
Parse error:synitax error、unceptant ':'
で始まるエラーメッセージは、クラス静的参照Class :: $ Variable
をClass:$ Variable
として誤って記述することによって引き起こされる可能性があります。