<p>誰もが文法エラーに遭遇することがあります。経験豊富なプログラマーでも間違いを犯します。初心者にとって、これは学習プロセスの一部にすぎません。ただし、エラー メッセージは通常、次のように解釈するのが簡単です。
<ブロック引用>
<p>PHP 解析エラー: 構文エラー、index.php 行 20 に予期しない '{'</p>
</blockquote>
<p>予期しないシンボルが必ずしも真の原因であるとは限りません。ただし、行番号を見れば、どこから見始めればよいかがわかります。 </p>
<ブロック引用>
<p>常に <strong>コード コンテキスト</strong> を確認してください。構文エラーは、
コードの前の行に記載されている <em> または </em> に隠れていることがよくあります。コードをマニュアルの構文例と比較してください。 </p>
</blockquote>
<p>ただし、すべてのケースが一致するわけではありません。ただし、
構文エラーを解決するための一般的な手順がいくつかあります。このリファレンスには、よくある落とし穴がまとめられています。 </p>
<li><p>予期しない T_STRING</p>
</li>
<li><p>予期しない T_VARIABLE </p><p>予期しない '$varname' (T_VARIABLE)</p>
</li>
<li><p>予期しない T_CONSTANT_ENCAPSED_STRING </p><p>予期しない T_ENCAPSED_AND_WHITESPACE</p>
</li>
<li><p>予期しない $end</p>
</li>
<li><p>予期しない T_FUNCTION...</p>
</li>
<li><p>予期しない<code>{</code></p><p>予期しない<code>}</code></p><p>予期しない<code> (</code></p><p>予期せぬ<code>)</code></p>
</li>
<li><p>予期しない <code>[</code></p><p>予期しない<code>]</code></p>
</li>
<li><p>予期しない T_IF </p><p>予期しない T_FOREACH </p><p>予期しない T_FOR </p><p>予期しない T_WHILE </ p>< p> 予期しない T_DO </p>gt;<p> 予期しない T_PRINT </p><p> 予期しない T_ECHO</p>
</li>
<li><p>予期しない T_LNUMBER</p>
</li>
<li><p>事故?</p>
</li>
<li><p>予期しない継続 (T_CONTINUE)</p><p>予期しない継続 (T_BREAK)</p><p>予期しない継続 (T_RETURN)</p>
</li>
<li><p>予期しない "="</p>
</li>
<li><p>予期しない T_INLINE_HTML…</p>
</li>
<li><p>予期せぬ T_THIS_IS_THE_THING...</p>
</li>
<li><p>予期しない T_OBJECT_OPERATOR...</p>
</li>
<li><p>予期しない T_DOUBLE_ARROW...</p>
</li>
<li><p>予期しない T_SL...</p>
</li>
<li><p>予期しない T_BOOLEAN_OR…
</p><p>
予期しない T_BOOLEAN_AND…</p>
</li>
<li><p>予期しない T_IS_EQUAL </p><p>
予期しない T_IS_GREATER_OR_EQUAL </p><p>
予期しない T_IS_IDENTICAL </p><p>
予期しない T_IS_NOT_EQUAL </p><p>
予期しない T_IS_NOT_IDENTICAL </p><p>
予期しない T_IS_SMALLER_OR_EQUAL </p><p>
予期しない <code><</code> </p><p>
予期しない <code>></code></p>
</li>
<li><p>予期しない T_NS_SEPARATOR...</p>
</li>
<li><p>入力に予期しない文字があります: '<code></code>' (ASCII=92) state=1</p>
</li>
<li><p>予期しない 'パブリック' (T_PUBLIC) </p>gt;<p>予期しない 'プライベート' (T_PRIVATE) </p><p>予期しない '保護' (T_PROTECTED ) </ p><p>予期しない 'T_FINAL'...</p>
</li>
<li><p>予期しない T_STATIC...</p>
</li>
<li><p>予期しない T_CLASS…</p>
</li>
<li><p>予期しない「使用」(T_USE)</p>
</li>
<li><p>予期しない T_DNUMBER</p>
</li>
<li><p>予期しない <code>、</code> <em>(カンマ)</em></p>
</li>
<li><p>予期しない<コード>。</code> <em>(ピリオド)</em></p>
</li>
<li><p>予期しない <code>;</code> <em>(セミコロン)</em></p>
</li>
<li><p>予期しない<code>*</code><em> (アスタリスク)</em></p>
</li>
<li><p>予期しない<code>: </code><em> (コロン)</em></p>
</li>
<li><p>予期しない ':'、予期される ','、または ')'</p>
</li>
<li><p>予期しない<code>&</code> (呼び出し時に参照によって渡されます)</p>
</li>
<li><p>予期しない<コード>。 </code></p>
</li>
</ul>
<p>関連資料:</p>
<li>このエラーは PHP では何を意味しますか? (ランタイムエラー)
<li>解析エラー: 構文エラー、予期しない T_XXX</li>
<li>解析エラー: 構文エラー、予期しない T_ENCAPSED_AND_WHITESPACE</li>
<li>解析エラー: 構文エラー、予期しない T_VARIABLE</li>
</ul>
</li>
<li>この記号は PHP では何を意味しますか? (言語タグ)</li>
<li>それらの<code>""</code>smart<code>''</code>引用符はPHPにとって何の意味もありません</li>
</ul>
<p>また:</p>
<li>PHP マニュアルとそのさまざまな言語タグは php.net</li>
<li>または Wikipedia の PHP 構文入門。 </li>
<li>最後に、もちろん、<strong>php</strong> タグ Wiki です。 </li>
</ul>
<p>Stack Overflow は初心者プログラマを歓迎しますが、主に専門的なプログラミングの質問を対象としています。 </p>
<li>ほとんどが主題から外れていると考えられる、全員のコーディング エラーや狭いスペル ミスに答えます。 </li>
<li>したがって、構文修正リクエストを投稿する前に、時間をかけて基本的な手順に従ってください。 </li>
<li>それでもこれを行う必要がある場合は、エラーと思われるもの、またはエラーの可能性があるものについて、独自の解決策、試みた修正、および思考プロセスを示してください。</li>
</ul>
<p><em>ブラウザ</em>「SyntaxError: 無効な文字」などのエラー メッセージが表示される場合、それは実際には PHP に関連するものではなく、JavaScript の構文エラーです。 </p>
<p><strong>ベンダー コードによって発生する構文エラー:</strong>最後に、構文エラーがコード ベースの編集によって発生するのではなく、外部ベンダー パッケージのインストールまたはアップグレード後に発生するかどうかを考慮してください。 、PHP バージョンによる非互換性の可能性があるため、プラットフォームの設定に対してベンダーの要件を確認してください。 </p>
このトピックは完全に議論されすぎている/過度に複雑だと思います。 IDE を使用すると、構文エラーを完全に回避できます。 IDE なしで作業するのはプロフェッショナルではないとさえ言えます。なぜ?なぜなら、最新の IDE は文字を入力するたびに構文をチェックするからです。コーディング中に行全体が赤になり、大きな警告通知に構文エラーの正確な種類と正確な位置が表示された場合、他の解決策を探す必要はまったくありません。
構文チェック IDE を使用することの意味:
入力時に構文エラーが正しく表示されるため、(事実上) 構文エラーが二度と発生することはありません。正直に。
構文チェック機能を備えた優れた IDE (すべて Linux、Windows、Mac で利用可能):
構文エラーとは何ですか?
PHP は、C スタイル および Imperative プログラミング言語に属します。厳密な構文規則があり、シンボルや識別子が間違って配置された場合に回復することはできません。コーディングの意図を推測することはできません。
最も重要なヒント
常に講じることができる基本的な予防措置がいくつかあります:
適切な コード インデント を使用するか、高度なコーディング スタイルを採用してください。 可読性により不正を防止します。
IDE または 構文強調表示 を備えた PHP 用のエディタを使用します。 これはブラケットとブラケットのバランスにも役立ちます。
マニュアルの 言語リファレンスと例を読んでください。 2回もやれば熟練になります。
パーサーエラーの解釈方法
一般的な構文エラー メッセージは次のとおりです。
これには、考えられる 構文エラーがリストされます。前述の filename および linenumber を参照してください。
T_STRING
などの 名前は、パーサー/トークナイザーによって解析できないシンボルの最終処理を説明します。ただし、これが必ずしも構文エラーの原因であるとは限りません。前のコード行 を確認することも重要です。多くの場合、構文エラーは以前に起こった単なる事故です。エラー行番号は、パーサーが最終的にすべての処理を放棄する正確な行番号です。
構文エラーを解決する行を見てください。
暴走した文字列や間違った演算子がある場合、通常はここで原因が見つかります。
行を左から右に読んで、それぞれの記号が何をするかを想像してください。
をより頻繁に確認する必要があります。
具体的には、前の行の末尾/ステートメントに- ;
- {
セミコロンがありません。 (少なくともスタイルの観点からは。)
コード ブロック
}
が閉じられていないか、正しくネストされていない場合は、ソース コードをさらに調査する必要がある場合があります。簡略化するには、コードを適切にインデントしてください。を見てください!
文字列、変数、定数はすべて異なる色にする必要があります。
演算子- -*/.
文字列の色付けが長すぎるか短すぎる場合は、エスケープされていない、または末尾が欠落している - "
- 、
も異なる色で表示される必要があります。そうしないと、間違った環境にある可能性があります。
または
##同じ色の 2 つの隣接する句読点も問題を意味する可能性があります。一般に、演算子の後に'
文字列マーカー .# が見つかりました。
--
、または括弧が続かない場合、演算子は単独です。ほとんどの場合、直接接続された 2 つの文字列/識別子は正しくありません。
任意の コーディング スタイルに従ってください。
長い列を一時的に解消します。演算子または定数と文字列の間には、自由に 改行を追加できます。次に、パーサーはエラーを解析した行番号を外部化します。非常に冗長なコードを調べる代わりに、欠落している構文記号や間違って配置されている構文記号を特定できます。
if
ステートメントを個別の条件またはネストされた
if条件に分割します。
正しいコードを簡単に識別できます。-
不明な点は、-
とパーサーが文句を言う行。 -
長いコード ブロックを分割するは、構文エラーの原因を特定するのに役立ちます。
コメントアウトされた部分を書き直してください。
三元
? :条件演算子はコードを要約できるため、非常に便利です。ただし、すべての状況で可読性が向上するわけではありません。不慣れな状況では、単純な- if
/- elseif:
初心者が犯す最も一般的な間違いは次のとおりです:
ステートメントを使用することを好みます。
if:PHP の代替構文 (
/
endif;
) はテンプレートでは一般的ですが、おそらくそれほどではありません。通常の{
code}
ブロック。セミコロン終了ステートメント/行
;がありません。-
" または - '
連結。 -
( ブラケット- )
1 つの文法問題を解決すると、次の文法問題が明らかになる可能性があることを忘れないでください。
の文字列引用符が一致しません。引用符はエスケープされていません。
.忘れられた演算子、特に文字列
アンバランス
。報告された行でそれらをカウントします。それらの量は等しいですか?
1 つの問題を解決したが、以下のコードの一部に別の問題が現れた場合、基本的には正しい方向に進んでいます。
編集後に同じ行に新しい構文エラーが表示された場合、変更は失敗する可能性があります。 (しかしいつもではない。) ######
修復できない場合は、以前の動作コードのバックアップを復元してください。
目に見えない Unicode 文字
grep --color -P -n "\[\x80-\xFF\]" file.php
を最初に非 ASCII 記号を見つけて試してください測定。特に、BOM、ゼロ幅スペースまたは非改行スペース、およびスマート引用符がソース コードに頻繁に表示されます。
ファイルに保存されている 改行タイプ に注意してください。
PHP は \n ライン フィード文字のみをサポートしますが、\r キャリッジ リターン文字はサポートしません。
これは、MacOS ユーザーにとって問題になることがあります (エディターの設定が間違っている場合は OS X 上でも)。
通常、問題は単一行の
//
または# コメントを使用した場合にのみ発生します。改行が無視される場合、複数行の
/*...*/
コメントがパーサーに干渉することはほとんどありません。構文エラーがネットワーク経由で送信されない場合 : たまたまマシンに構文エラーがありました。しかし、同じファイルをオンラインに投稿しても表示されなくなりました。これは次の 2 つのうちの 1 つだけを意味します:
間違ったファイルを表示しています。
または、コードに目に見えない浮遊 Unicode が含まれています (上記を参照)。 簡単に見つけることができます。Web フォームのコードをテキスト エディターにコピーするだけです。
PHP バージョン を確認してください。すべてのサーバーですべての構文構成が使用できるわけではありません。
php -v
(コマンドラインインタープリター用)
Web サーバー経由で呼び出します。
これらは必ずしも同じであるとは限りません。特にフレームを使用する場合は、それらを一致させる必要があります。
を関数/メソッド、クラス識別子、または定数として使用しないでください。
でエラー メッセージを確認できます。構文シンボルは検索しにくいです (ただし、Stack Overflow 自体は SymbolHound によってインデックス付けされています)。したがって、関連するコンテンツを見つけるには、さらにいくつかのページを参照する必要がある場合があります。 その他のガイド:
サイトが空白の場合、通常は文法上のエラーが原因です。 表示を有効にします:
エラー報告 = E_ALL
表示エラー = 1
php.ini
PHP は最初の行を解釈/実行することさえできないため、壊れたスクリプトで有効にするのは遅すぎます。簡単な解決策は、一般的に、または mod_php の .htaccess
経由で、 .user.ini
でも FastCGI 設定を使用します。
test.php
次に、このラッパー スクリプトにアクセスすることによって、失敗したコードが呼び出されます。:
のようなラッパー スクリプトを作成することです。 リーリーerror_log
を有効にして、
Web サーバーの error.logを表示することも役立ちます。