PHPの解析/構文エラーとその解決方法?

誰もが構文エラーに遭遇する。経験豊富なプログラマーでさえタイプミスをする。新人にとって、それは学習プロセスの一部です。しかし、次のようなエラーメッセージを解釈するのは簡単です: PHP Parse error: syntax error, unexpected '{' in index.php on line 20. 予期しないシンボルが本当の原因とは限りません。しかし、行番号から、どこから探し始めるべきかの大まかな見当がつきます。 常にコードコンテキストを見てください。構文の間違いは、多くの場合、言及されたまたは前のコード行に隠れています。マニュアルの構文例と自分のコードを比較してください。 すべてのケースが一致するわけではありません。しかし、シンタックスミスを解決するための一般的なステップがいくつかあります。 このリファレンスには、よくある落とし穴がまとめられています:

質問へのコメント (18)
ソリューション

構文エラーとは?

PHPは、[C-style][1] および [imperative][2] プログラミング言語に属します。PHPには厳格な文法規則があり、誤った記号や識別子に遭遇した場合に、 それを回復することはできません。コーディングの意図を推測することはできません。 関数定義構文抽象][3]。

最も重要なヒント

常にできる基本的な注意事項がいくつかあります:

  • 適切なコードのインデントを使用する、または高尚なコーディングスタイルを採用する。 可読性は不規則性を防ぎます。
  • シンタックスハイライトのある[**IDEまたはPHP用エディタ][4]を使用してください。 また、括弧とブラケットのバランスをとるのにも役立ちます。 期待される: セミコロン][5]。
  • 言語リファレンス][6]とマニュアルの例を読む。 ある程度習熟するために2回。

    パーサーエラーの解釈方法

    典型的な構文エラーメッセージはこうです: 構文エラー: 構文エラー、予期しない T_STRING, expected ';' in *file.php on line 217. これは、構文ミスの可能な場所をリストしています。言及されたファイル名行番号を参照してください。 T_STRING`のような[moniker][7]は、パーサー/トークナイザーが最終的に処理できなかったシンボルを説明します。しかし、これが構文ミスの原因とは限りません。 前のコード行**も調べることが重要です。多くの場合、構文エラーは以前に起こった災難にすぎません。エラー行番号は、パーサーが最終的に処理をあきらめた場所にすぎません。

    構文エラーの解決

    構文エラーを絞り込んで修正する方法はたくさんあります。

  • 言及されているソースファイルを開いてください。記載されているコード行を見てください。
    • 文字列が暴走していたり、演算子の位置がずれていたりする場合は、たいていここに原因があります。
    • 行を左から右に読んで、それぞれの記号が何をするのか想像してください。
  • さらに定期的に、先行行も見る必要がある。
    • 特に、;のセミコロンが前の行の行末/ステートメントで欠落しています。(少なくとも文体の観点からは )
    • コードブロック } が正しく閉じられていなかったり入れ子になっていたりする場合は、 ソースコードのさらに上まで調査する必要があるかもしれません。それを単純化するために、適切な コード・インデント を使用してください。
  • 構文の色分け**を見てください!
    • 文字列、変数、定数はすべて異なる色を持つべきです。
    • 演算子 +-*/. も異なる色にする。そうでないと、間違った文脈になってしまうかもしれません。
    • 文字列の色分けが長すぎたり短すぎたりする場合は、エスケープされていないか、文字列を閉じる "' が欠けています。
    • また、同じ色の句読点が2つ隣り合っている場合もトラブルを意味します。通常、演算子の後に++--、括弧がなければ、演算子は単独で存在する。2つの文字列や識別子が直接隣り合っているのは、ほとんどの文脈で正しくありません。
  • 空白はあなたの友達です。 どんな**コーディング・スタイルにも従いなさい。 < -- PSR-xで初心者を悩ませるのはやめましょう。--&gt;
  • 長い行を一時的に分割する。
    • 演算子や定数と文字列の間に改行**を入れるのは自由です。パーサーは解析エラーの行番号を具体化します。非常に長いコードを見る代わりに、足りない構文記号や間違った構文記号を切り分けることができる。
    • 複雑な if ステートメントを個別の if 条件や入れ子の if 条件に分割する。
    • 長い数式やロジックチェーンの代わりに、一時変数を使ってコードを単純化する。(読みやすくなる=エラーが減る)。
    • 間に改行を入れる: 1.1.正しいコードとすぐにわかるもの、 2.不明な部分、 3.そして、パーサーが文句を言う行です; 長いコードブロックを分割することは、構文エラーの原因を突き止めるのに 本当に 役立ちます。
  • 問題のあるコードをコメントアウトしてください。
    • もし問題の原因を特定できない場合は、コードのブロックをコメントアウト(一時的に削除)することから始めましょう。
    • 構文解析エラーを取り除いたら、すぐに問題の原因を見つけたことになります。そこをもっとよく見てください。
    • 関数やメソッドのブロック全体を一時的に削除したい場合もあります。(中括弧が合っていなかったり、インデントがおかしかったりする場合)。
    • 構文の問題が解決できないときは、コメントアウトされた部分をゼロから書き直してみてください。
  • 初心者のうちは、いくつかの紛らわしい構文を避けてください。
    • 条件演算子の三項 ?しかし、すべての場合において可読性を向上させるものではありません。未熟なうちは、プレーンなif` 文を使うことをお勧めします。
    • PHPの代替構文(if:/elseif:/endif;)はテンプレートでは一般的ですが、通常の { code } ブロックよりも間違いなく簡単ではありません。
  • 最も一般的な初心者の間違いは次のようなものです:
    • ステートメント/行を終了するセミコロン ; が見つからない。 -"'`の文字列引用符の不一致や、引用符のエスケープされていない文字列。
    • 忘れられた演算子、特に文字列 . の連結。
    • アンバランスな (括弧 ).報告された行の括弧を数えてください。その数は同じですか?
  • 1つの構文の問題を解決すると、次の問題が見つかる可能性があることを忘れないでください。
    • 一つの問題を解決しても、その下のコードで別の問題が出てきたら、あなたはほとんど正しい道を歩んでいることになります。
    • 編集後、同じ行で新たな構文エラーが発生した場合は、あなたが試みた変更が失敗だった可能性があります。(常にというわけではありませんが)。
  • 修正できない場合は、以前動作していたコードのバックアップを復元してください。
    • ソースコードのバージョン管理システムを採用する。壊れたバージョンと最後に動作したバージョンの差分をいつでも見ることができる。構文の問題が何なのかを知るためのヒントになるかもしれません。
解説 (2)

このトピックは完全に議論されすぎている/複雑すぎると思います。 IDEを使用することは、構文エラーを完全に回避するための方法です。 IDEなしで作業することは、専門家ではないとも言えます。 なぜ? 最新のIDEは、入力するすべての文字の後に構文をチェックするためです。 コーディングすると、行全体が赤に変わり、大きな警告通知で構文エラーの正確なタイプと正確な位置が表示される場合は、別のソリューションを検索する必要はまったくありません。

構文チェックIDEを使用するということは、次のことを意味します。

入力時に正しく表示されるからといって、(効果的に)構文エラーに二度と遭遇することはありません。 真剣に。

構文チェック付きの優れたIDE(それらはすべてLinux、Windows、Macで使用できます):

1。 NetBeans[無料]。 2。 PHPStorm[$ 199 USD]。 3。 EclipsePHPプラグイン[無料]。 4。 Sublime$ 80 USD

解説 (5)

予期しない [

最近では、予期しない [配列ブラケットが古いPHPバージョンで一般的に見られます。 短い配列構文は、PHP > = 5.4 以降で使用できます。 古いインストールは array()のみをサポートします。

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         ⇑

同様に、配列関数の結果の逆参照は、古いPHPバージョンでは使用できません。

$result = get_whatever()["key"];
                      ⇑

参照-このエラーはPHPで何を意味しますか? -「構文エラー、予期しない \ []は、最も一般的で実用的な回避策を示しています。

ただし、PHPのインストールをアップグレードするだけの方が常に優れています。 共有Webホスティングプランの場合、最初の調査(例:. SetHandler php56-fcgiを使用して、新しいランタイムを有効にできます。

参照:

ところで、古い+遅いPHPバージョンに本当に固執している場合は、プリプロセッサとPHP 5.4構文ダウンコンバーターもあります。

予期しない [構文エラーの他の原因。

PHPバージョンの不一致でない場合、多くの場合、プレーンタイポまたは新規参入者の構文の誤りです。

  • PHP& nbsp; 7でも、クラスの配列プロパティ宣言/式を使用できません。

    保護された$ var ["x"] = "Nope";。
                   ⁇ 。
  • [を開く中括 ⁇ {または括 ⁇ (は一般的な見落としです。

    foreach [$ a $ b)。
             ⁇ 。

    または:

    function foobar [$ a、$ b、$ c] {。
                    ⁇ 。

*または、定数(PHP 5.6より前)を配列として逆参照しようとしています。

    $ var = const [123];。
            ⁇ 。

少なくともPHPはその「const」を定数として解釈します。

配列変数(ここでは典型的な原因です)にアクセスする場合は、先頭の `$` sigilを追加して、 `$ varname`になります。

*連想配列のメンバーで「グローバル」キーワードを使用しようとしています。 これは有効な構文ではありません。

    グローバル$ var ['key'];。
< br />。

予期しない ]閉じる角括 ⁇ 。

これはややまれですが、終了配列 ]ブラケットによる構文事故もあります。

*再び )括 ⁇ または }中括 ⁇ との不一致が一般的です。

    function foobar($ a、$ b、$ c){。
                               ⁇ 。

*または、配列がない配列を終了しようとしています。

    $ var = 2];。

これは、*複数行*および*ネスト*配列宣言でよく発生します。

    $ array = [1、[2、3]、4、[5、6 [7、[8]、[9、10]]、11]、12]]、15];。
                                                  ⁇ 。
その場合は、IDEを使用してブラケットマッチングを行い、時期 ⁇ 早の `] `配列クロージャーを見つけます。 少なくとも、スペースと改行を増やして絞り込みます。
解説 (1)

想定外のT_VARIABLE

予期しないT_VARIABLE"は、現在の式やステートメントの構造に合わない $variable というリテラル名があることを意味します。

![意図的に抽象的/不正確な演算子+$変数ダイアグラム][1]。

  1. Missing semicolon

解説 (0)

予期しない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>。

そして、それは誤ったPHP変数の補間で最も頻繁に発生します:

                               ⁇ 。
    echo "ここに$ wrong ['array']アクセスがあります";。

配列キーの引用は、PHPのコンテキストでは必須です。 しかし、二重引用符で囲まれた文字列(またはHEREDOC)では、これは間違いです。 パーサーは、含まれている単一の引用された「 'string'」について不平を言います。なぜなら、それは通常、そこに文字通りの識別子/キーを期待するからです。

より正確には、配列参照にPHP2スタイル[二重引用符内の単純な構文](http://www.php.net/language.types.string#language.types.string.parsing)を使用することが有効です。

    echo「これは$ valid [ここ]だけです。 ...";。

ただし、ネストされた配列またはより深いオブジェクト参照には、[複雑な巻き糸式](http://www.php.net/language.types.string#language.types.string.parsing#complex + curly + syntax)構文が必要です。

    echo "{$ array ['as_usual']}を巻き毛の構文で使用します。";。

不明な場合は、一般的に使用する方が安全です。 それはしばしばより読みやすいとさえ考えられています。 そして、より良いIDEは実際にそのために異なる構文の色付けを使用します。

2。 < h3>連結不足< / h3>。

文字列が式に従っているが、連結または他の演算子がない場合、PHPは文字列リテラルについて不満を言うことがわかります。

                            ⁇ 。
    「こんにちは」を印刷します。 . 世界 "。 !";。

あなたと私には明らかですが、PHPは文字列がそこに追加されることを意図していたことを*推測*できません。

3。 < h3>文字列引用エンクロージャの混乱< / h3>。

同じ構文エラーは、[confounding string delimiters](https://stackoverflow.com/questions/13565768/php-syntax-error-unexpected-t-constant-encaps-string)でも発生します。 単一の「」または「二重」の引用で始まる文字列も同じで終わります。

                     ⁇ 。
    "< a href =" 'を印刷します。 . $ link。 . '">ここをクリック< / a> ";。
           ⁇ 。

その例は二重引用符で始まりました。 しかし、二重引用符もHTML属性に向けられていました。 ただし、意図された連結演算子は、一重引用符の2番目の文字列の一部として解釈されました。

> **ヒント**:エディター/ IDEを設定して、シングルおよびダブル引用文字列にわずかに異なる色付けを使用します。 (また、アプリケーションロジックを好むのに役立ちます。 テキスト出力の場合は二重引用符で囲まれた文字列、定数のような値の場合は単一引用符で囲まれた文字列。)。

これは、そもそも二重引用符から抜け出すべきではない良い例です。 代わりに、[適切な `\ "`エスケープ](https://stackoverflow.com/questions/10674121/php-parse-error-syntax-error-unexpected-t-constant-encaps-string-expecting)を使用してください。 HTML属性´引用:

    "< a href = \" {$ link} \ ">ここをクリック< / a>"; ";。

これは構文の混乱につながる可能性もありますが、すべての優れたIDE /エディターは、エスケープされた引用符を異なる色で表示することで再び役立ちます。

4。 < h3>開封の引用が欠落< / h3>。

同様に、[忘れられたオープニング ` `/ '' '引用](https://stackoverflow.com/questions/17379114/how-to-fix-unexpected-t-constant-encaps-string-syntax-error)のレシピです。パーサーエラーの場合:

                    ⁇ 。
     make_url(login '、' open ');。

ここで、「login」が文字列パラメーターであることを意図していた場合、「」、「」は裸語の後に文字列リテラルになります。

5。 < h3>配列リスト< / h3>。

配列作成ブロックの `、`コンマを見逃すと、パーサーには2つの連続した文字列が表示されます。

    array( ⁇ 。
         "key" => "値"。
         "次へ" => "。..."、。
    );。

最後の行には常に追加のカンマが含まれている可能性がありますが、その間の行を見落とすことは許されません。 構文を強調表示しないと、これを発見するのは困難です。

6。 < h3>関数パラメーターリスト< / h3>。

同じこと[関数呼び出しの場合](https://stackoverflow.com/questions/9352932/syntax-error-unexpected-t-constant-encaps-string):

                              ⁇ 。
    myfunc(123、「テキスト」、「および」「詳細」)。

7。 < h3>暴走弦< / h3>。

一般的なバリエーションは、非常に単純に忘れられた文字列ターミネーターです。

                                     ⁇ 。
    mysql_evil( "SELECT * FROM stuffs); 
    印刷 "'ok '";。
           ⁇ 。

ここで、PHPは2つの文字列リテラルを互いに直接不平を言っています。 しかし、本当の原因はもちろん、閉じられていない以前の文字列です。

こちらもご覧ください

解説 (0)

想定外のT_STRING

T_STRINGは少し誤用です。引用符で囲まれた"string"を指すのではない。これは生の識別子に遭遇したことを意味する。これは、bareな単語から、CONSTANT`や関数名の残り、忘れられた引用符で囲まれていない文字列、またはプレーンテキストに及ぶ可能性がある。

  1. 引用符で囲まれていない文字列'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) が発生することもあります。

  2. ノンプログラミング文字列引用符

解説 (0)

予期しない (

括 ⁇ を開くことは通常、「if/foreach/for/array/list」などの言語構成に従うか、算術式を開始します。 それらは、「strings」、以前の「()」、孤独な「$」の後、およびいくつかの典型的な宣言のコンテキストでは構文的に正しくありません。

1。 < h3>関数宣言パラメーター< / h3>。

このエラーのまれな発生は、[式をデフォルトの関数パラメーターとして使用しようと][1]です。 これは、PHP7でもサポートされていません。

    function header_fallback($ value、$ expires = time()+ 90000){。

関数宣言のパラメータは、リテラル値または定数式のみにすることができます。 関数呼び出しとは異なり、「whatever(1 + something()* 2)」などを自由に使用できます。

2。 < h3>クラスプロパティのデフォルト< / h3>。

[クラスメンバー宣言](https://stackoverflow.com/questions/11313051/parse-error-syntax-error-unexpected-expecting-or-in)についても同じことが言えます。式:

    クラスxyz { ⁇ 。
        var $ default = get_config( "xyz_default");。

そのようなものをコンストラクターに入れます。
[PHP属性が関数を許可しない理由]も参照してください?](https://stackoverflow.com/questions/3960323/why-dont-php-attributes-allow-functions)。

ここでも、PHP 7では「var $ xy = 1 + 2 +3;」定数式のみが許可されていることに注意してください。

3。 < h3> PHPのJavaScript構文< / h3>。

JavaScriptまたは[jQuery構文][2]の使用は、明らかな理由によりPHPでは機能しません。

    <?php ⁇ 。
        印刷$(document).text();。

これが発生すると、通常、終了していない先行文字列を示します。文字通りの「< script>」セクションがPHPコードのコンテキストに漏れています。

4。 < h3> isset(())、空、キー、次、現在< / h3>。

`isset()`と`empty()`はどちらも言語組み込みであり、関数ではありません。 [変数に直接アクセスする必要がある][3]。 誤って括 ⁇ のペアを追加しすぎると、次の式が作成されます。

               ⁇ 。
    if(isset(($ _GET ["id"]))){。

同じことが暗黙の変数名アクセスを必要とするすべての言語構成に適用されます。 これらの組み込みは言語文法の一部であるため、装飾的な余分な括 ⁇ は許可されません。

変数参照を必要とするユーザーレベルの関数-式の結果が渡される-代わりにランタイムエラーが発生します。


予期しない )

1。 < h3>不在関数パラメーター< / h3>。

迷うことはできません[関数呼び出しでコンマが持続する][4]。 PHPはそこに値を期待しているため、早期終了 `)`括 ⁇ について不満を述べています。

                   ⁇ 。
    callfunc(1、2、);。

末尾のコンマは、「array()」または「list()」構造でのみ許可されます。

2。 < h3>未完成の式< / h3>。

算術式で何かを忘れた場合、パーサーはあきらめます。 それはどのようにそれを解釈する必要があるのか:

                    ⁇ 。
    $ var = 2 *(1 +);。

そして、あなたが「)」のクロージングさえ忘れた場合、代わりに予期しないセミコロンについての不満を得るでしょう。

3。 < h3> constant< / code>としてのフォーラック< / h3>。

[コントロールステートメントの忘れられた変数 `$`プレフィックス](https://stackoverflow.com/questions/11624495/how-to-fix-syntax-error-in-php-unexpected)の場合、次のようになります。

                        ⁇ 。
    foreach($ array as wrong){。

ここのPHPは、代わりに `::`を期待していたことを伝えることがあります。 なぜなら、class :: $ variableは予想される$ variable式を満たすことができたからです。.


予期しない {

巻きブレース {および}はコードブロックを囲みます。 そして、それらに関する構文エラーは通常、いくつかのincorrecネストを示します。

1。 < h3> if< / code>での一致しないサブ式< / h3>。

最も一般的には[アンバランス `(`および`)`](https://stackoverflow.com/questions/11473504/php-syntax-error-on-line-9)は、パーサーが開口カーリーについて不満を言う場合の原因です `{`早すぎます。 簡単な例:

                                   ⁇ 。
    if(($ x == $ y)&& (2 == true){。

親子を数えるか、それを助けるIDEを使用してください。 また、スペースなしでコードを記述しないでください。 読みやすさが重要です。

2。 < h3> {および}式コンテキスト< / h3>。

表現に中括 ⁇ を使用することはできません。 括 ⁇ とカーリーを混同すると、言語文法に準拠しなくなります。

                ⁇ 。
    $ var = 5 * {7 + $ x};。

ローカルスコープ変数 `$ {references}`など、識別子構築にはいくつかの例外があります。

3。 < h3>変数または巻き毛の表現< / h3>。

これはかなりまれです。 ただし、複雑な変数式について「{」と「}」のパーサーの苦情が表示される場合もあります。

                           ⁇ 。
    「こんにちは{$ world [2 {]}。 !";。

ただし、このような状況では予期しない「}」が発生する可能性が高くなります。


予期しない }

「予期しない }」エラーが発生した場合は、コードブロックを早すぎて閉じています。

1。 < h3>コードブロックの最後のステートメント< / h3>。

それは、終了していない表現に対して発生する可能性があります。

関数/コードブロックの最後の行に末尾 `;`セミコロンがない場合:

    関数any(){。
        doStuff()。
    }。

ここで、パーサーは、関数の結果または他の何かに「+ 25;」を追加したいかどうかを判別できません。

2。 < h3>無効なブロックネスト/忘れられた {< / code> < / h3>。

コードブロックが `}`を早く閉じているとき、または開口部 `{`を忘れたときに、このパーサーエラーが表示されることがあります。

    function doStuff(){。
        if(true) ⁇ 。
            「はい」を印刷します。
        }。
    }。

上記のスニペットでは、「if」に開口部「{」の巻き毛ブレースがありませんでした。 したがって、以下の「}」のクロージングは 冗長になりました。 したがって、機能を対象とした次のクロージング `} `は、元のオープニング `{`カーリーブレースに関連付けられませんでした。

このようなエラーは、適切なコードインデントがないと見つけるのがさらに難しくなります。 IDEとブラケットのマッチングを使用します。


予期しない {、期待 (

条件/宣言ヘッダーおよびを必要とする言語構成は、コードブロックがこのエラーをトリガーします。

1。 < h3>パラメータリスト< / h3>。

たとえば、[パラメータリストのない誤って宣言された関数][5]は許可されていません。

                      ⁇ 。
    {何でも機能。
    }。

2。 < h3>コントロールステートメントの条件< / h3>。

そして、同様に[`if` without condition][6]を持つことはできません。

       ⁇ 。
    {。
    }。

これは意味がありません。 通常の容疑者についても同じことが、「for / foreachwhile/do`などです。

この特定のエラーが発生した場合は、いくつかの手動の例を確実に調べる必要があります。

解説 (3)
< h2>。

予期しない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>。

一致しないコードブレースは、次のようなあまりフォーマットされていないコードに共通しています。

    if((。!($ opt ["uniQartz5.8"]。!= $ this-> check58))または(empty($ _POST ['poree'])){if。

    ($ true){echo "halp";} elseif((。!$ z)または%b){excSmthng(False、5.8)} elseif(False){。


コードがこのように見える場合は、新たに開始してください。! それ以外の場合は、あなたや他の誰にとっても修正できません。 これをインターネットで紹介して助けを求める意味はありません。

if / elseコンディショナルとそれらの `{`コードブロック `}`のネストされた構造と関係を視覚的に追跡できる場合にのみ、それを修正できます。 IDEを使用して、それらがすべてペアになっているかどうかを確認します。

    if(true){。

         if(false){。

                  ...

         }。

         elseif($ whatever){。

             if($ something2){。

                 ...

             }。

             その他{。

                 ...

             }。

         }。

         その他{。

             ...

         }。

         if(false){// 2番目の `if`ツリー。

             ...

         }。

         その他{。

             ...

         }。

    }。

    elseif(false){。

        ...

    }。

二重 `} ``} `はブランチを閉じるだけでなく、以前の状態構造も閉じます。 したがって、1つのコーディングスタイルに固執します。ネストされたif / elseツリーで混ぜて一致しないでください。

ここでの一貫性は別として、長い条件を回避することも役立つことがわかります。 一時的な変数または関数を使用して、読み取り不可能な「if」-式を回避します。

2。 < h3> IF< / code>式では使用できません< / h3>。

驚くほど頻繁に発生する新人の間違いは、印刷ステートメントなどの式で「if」ステートメントを使用しようとすることです。

                        ⁇ 。

    echo "< a href ='"。 . if($ link == "example.org"){echo ...

もちろん無効です。

[三元条件](https://stackoverflow.com/questions/3507042/if-block-inside-echo-statement)を使用できますが、読みやすさの影響に注意してください。

    echo "< a href ='"。 . ($ link。 ? "http://yes": "http://no")。 . "< / a>";。

それ以外の場合は、そのような出力構成を分割します。[複数の `if`sと `echo`s]を使用します(https://stackoverflow.com/questions/21175753/how-to-embed-if-statement-inside-echo)。

さらに良いことに、[一時変数](https://stackoverflow.com/questions/13778250/if-else-to-echo-image-in-php)を使用し、条件は次の前に配置します。

    if($ link){$ href = "yes"; }その他{$ href = "no"; }。

    echo "< a href = '$ href'> Link< / a>" ;。

そのような場合の関数や方法を定義することも、理にかなっています。

< h3>コントロールブロックは「結果」を返しません< / h3>。

これはあまり一般的ではありませんが、一部のコーダーは、「if」を*結果*を返すことができるかのように扱おうとさえしています。

    $ var = if($ x == $ y){"true"};。

これは、文字列の連結/式内で「if」を使用することと構造的に同じです。

  *ただし、[制御構造](http://php.net/language.control-structures)(if / foreach / while)には* "結果" *がありません。

  *文字通りの文字列「true」も単なる無効なステートメントです。

    <br><br>。

*コードブロック*の割り当てを使用する必要があります。

    if($ x == $ y){$ var = "true"; }。

または、 `に訴える?: `三元比較。

< h3> If< / h3>の場合。

次のいずれかの条件で[`if`](https://stackoverflow.com/questions/13316003/php-parse-error-syntax-error-unexpected-t-if)をネストできません。

                         ⁇ 。

    if($ x == trueおよび($ y。 != false)){。 ... }。

`and`(または `or`)はすでに連鎖比較を可能にするため、これは明らかに冗長です。

3。 < h3>忘れられた< / code>セミコロン< / h3>。

もう一度:各コントロールブロックはステートメントである必要があります。 以前のコードピースがセミコロンで終了しない場合、それは保証された構文エラーです:

                     ⁇ 。

    $ var = 1 + 2 + 3。

    if(true){...}。

ところで、「{...}」コードブロックの最後の行にもセミコロンが必要です。

4。 < h3>セミコロンが早すぎる< / h3>。

この落とし穴は簡単に見落とせないため、特定のコーディングスタイルを非難することはおそらく間違っています。

                 ⁇ 。

    if($ x == 5);。

    {。

        $ y = 7;。

    }。

    その他←。

    {。

        $ x = -1;。

    }。

これは想像以上に頻繁に発生します。

  * `if()`式を `; `](https://stackoverflow.com/questions/12856700/syntax-error-unexpected-t-else)で[終了]すると、voidステートメントが実行されます。 `; `は、それ自体の空の `{{{{{{{}}}}}}}`になります。!

  *したがって、「{...}」ブロックは「if」から切り離され、常に実行されます。

  *したがって、「else」は、オープンな「if」構造との関係がなくなりました。

これが、予期しないT_ELSE構文エラーにつながる理由です。

    <br><br>。

これは、この構文エラーの同様に微妙なバリエーションも説明します。

    if($ x){x_is_true(); };その他{something_else(); };。

ここで、コードブロック `{...} `の後の `; `は、 `if`全体を終了します。

構文的に「else」ブランチを切断して構築します。

5。 < h3>コードブロックを使用しない< / h3>。

`if`/`elseif`/`else` / `else`ブランチのコードブロックの巻き毛ブレース `{` ... `}`を構文的に省略できます。 悲しいことに、これは解凍されたコーダーに非常に一般的な構文スタイルです。 (誤った仮定の下では、これは入力または読み取りの方が速かった)。

ただし、構文がトリップする可能性が非常に高いです。 遅かれ早かれ、追加のステートメントがif / elseブランチに移動します。

    if(true)。

        $ x = 5;。

    elseif(false)。

        $ x = 6;。

        $ y = 7; ←。

    その他。

        $ z = 0;。

ただし、実際にコードブロックを使用するには、*** `{` ...`} `をそのように記述する必要があります。!

>熟練したプログラマでさえ、このブレースレス構文を避けます。

ルールの例外的な例外としてそれを理解してください。

6。 < h3>その他/ Elseifの順序が間違っています< / h3>。

もちろん、[条件付き注文](http://php.net/control-structures.elseif)です。

    if($ a){...}。

    その他{...}。

    elseif($ b){...}。

     ⁇ 。

好きなだけ `elseif`sを持つことができますが、[`else`は最後に行く必要があります](https://stackoverflow.com/questions/16619075/parse-error-syntax-error-unexpected-t -elseif)。 それがまさにそれです。

7。 < h3>クラス宣言< / h3>。

[上記](https://stackoverflow.com/a/18092318/345031)のように、クラス宣言に制御ステートメントを含めることはできません。

    クラスxyz {。

        if(true){。

            function($ var){{{{{{{}}}}}}}。

        }。

[関数](https://stackoverflow.com/questions/5440036/php-parse-error-syntax-error-unexpected-t-if-expecting-t-function)の定義、または1つを閉じたそのような場合、} `早すぎます。

8。 < h3>予期しないT_ELSEIF / T_ELSE< / h3>。

PHPとHTMLを混合する場合、「if / elseif」のクロージング「}」は同じPHPブロック「 `次の `elseif / else`として。  これは、「if」のクロージング「}」が「elseif」の一部である必要があるため、エラーを生成します。

    <?php if($ x){。 ?>。

        html。

    <?php}。 ?>。

    <?php elseif($ y){。 ?>。

        html。

    <?php}。 ?>。


正しい形式 `<?php} elseif`:


    <?php if($ x){。 ?>。

        html。

    <?php} elseif($ y){。 ?>。

        html。

    <?php}。 ?>。


これは多かれ少なかれ誤ったインデントの変化です-おそらくしばしば間違ったコーディングの意図に基づいています。

    [他のステートメントを* inbetween *]でマッシュすることはできません(https://stackoverflow.com/questions/11218975/parse-error-syntax-error-unexpected-t-else-and-i-dont-know-why) `if `と `elseif` ` '構造トークン:

    if(true){。

    }。

    「間」のエコー; ←。

    elseif(false){。

    }。

    >テキスト<?php←?
    その他{。

    }。

どちらも「{...」コードブロックでのみ発生し、制御構造トークンの間では発生しません。

*これはとにかく意味がありません。 PHPが `if`と `else`のブランチの間をジャンプするときに、いくつかの「未定義」の状態があったわけではありません。

*印刷ステートメントがどこにあるか、または両方のブランチで繰り返す必要があるかどうかを決める必要があります。

  <br><br>。


また、異なる制御構造間でif / else **を**分割することもできません。

    foreach($ array as $ i){。

        if($ i){...}。

    }。

    その他{...}。

`if`と `else`の間に[構文関係](https://stackoverflow.com/questions/567002/unexpected-t-elseif)はありません。 「foreach」字句スコープは「}」で終わるため、「if」構造を継続する意味はありません。

9。 < h3> T_ENDIF< / h3>。

予期しないT_ENDIFに不満がある場合は、代替構文スタイル `if:` ⁇  `elseif:` ⁇ `else:` ⁇  `endif; `を使用しています。 あなたは本当に二度考えるべきです。
   *一般的な落とし穴は、不気味な[類似した `:`コロンfor `; `セミコロン]を混乱させます(https://stackoverflow.com/questions/19250411/parse-error-syntax-error-unexpected-t-endif -in-home-content-error-php)。 (「Semicolon 早すぎる」でカバー)。

   *テンプレートファイルでインデントを追跡するのは難しいため、代替構文を使用すると、さらに多くなります。これは、「endif;」が「if:」と一致しないと考えられます。

   * [`} endif; `](https://stackoverflow.com/questions/23369695/syntax-error-unexpected-endif-t-endif-on-line-288)を使用します。

     *ダブル* `if`ターミネーターです。

     <br><br>。

一方、「予期しない$ end」は通常、忘れられたクロージング `} `カーリーブレースの価格です。

10。 < h3>割り当て対. 比較< / h3>。

したがって、これは構文エラーではありませんが、このコンテキストで言及する価値があります。

            ⁇ 。

    if($ x = true){{{{{{{}}}}}}}。

    その他{do_false(); }。

これは[`==` / `===`の比較ではなく、` = `の割り当て](https://stackoverflow.com/questions/2063480/the-3-different-equals)です。 これはかなり微妙で、一部のユーザーが簡単に条件ブロック全体を編集できるようになります。 最初に意図しない割り当てに注意してください-論理障害/不正行為が発生したときはいつでも。
解説 (0)

予期しない$ end。

PHPが「予期しない $ end」について話すとき、それはあなたのコードが時期 ⁇ 早に終わったことを意味します。 (メッセージは文字通りとられると少し誤解を招くものです。 新規参入者が想定するように、「$ end」という名前の変数についてではありません。 「ファイルの終わり」、 EOF< / kbd>を指します。)。

原因:コードブロック/および関数またはクラス宣言の不均衡な「{」および「}」。

これは、先行するコードブロックを閉じるための欠落している }カーリーブレースについて、常に**かなりです。

*繰り返しになりますが、そのような問題を回避するには、適切なインデントを使用してください。

*ブラケットが一致するIDEを使用して、「}」がどこに間違っているかを確認します。 ほとんどのIDEとテキストエディターにはキーボードショートカットがあります。

   -NetBeans、PhpStorm、Komodo: Ctrl< / kbd> [< / kbd>および Ctrl< / kbd>]< / kbd>
   -Eclipse、Aptana: Ctrl< / kbd> Shift< / kbd> P< / kbd>。
   -Atom、Sublime: Ctrl< / kbd> m< / kbd> -Zend Studio Ctrl< / kbd> M< / kbd>
   -Geany、Notepad ++: Ctrl< / kbd> B< / kbd> -ジョー: / kbd>

ほとんどのIDEは、ブレース、ブラケット、括 ⁇ に一致するハイライトも備えています。 これにより、相関関係を簡単に検査できます。

[IDEでのブラケットマッチング][1]。!

終了していない式。

また、「予期しない$ end」構文/パーサーエラーは、終了していない式やステートメントでも発生する可能性があります。

  • $ var = func(1、?> EOF< / kbd>。

まず、スクリプトの最後を見てください。 末尾の ;は、多くの場合、PHPスクリプトの最後のステートメントに対して冗長です。 しかし、あなたはそれを持っているべきです。 まさにそれがそのような構文の問題を絞り込むからです。

インデントされたHEREDOCマーカー。

[HEREDOCまたはNOWDOC][2]文字列で別の一般的な発生が表示されます。 終了マーカーは、先行スペース、タブなどで無視されます。:


print 
解説 (0)
< h2>。 予期しないT_IF
。 予期しないT_FOREACH
。 予期しないT_FOR
。 予期しないT_WHILE
。 予期しないT_DO
。 予期しないT_ECHO。 < / h2>。

「if」、「foreach」、「for」、「while」、「list」、「global」、「return」、「do」、「print」、「echo」などの制御構成は、ステートメントとしてのみ使用できます。 彼らは通常、一人で列に並んでいます。

1。 < h3>セミコロン;どこにいるの? < / h3>。

パーサーがコントロールステートメントについて不平を言っている場合、前の行で[セミコロンを見逃した](https://stackoverflow.com/questions/4210343/trouble-with-if-statement-php)はかなり普遍的です。

                  ⁇ 。
    $ x = myfunc()。
    if(true){。

解決策:前の行を調べます。セミコロンを追加します。

2。 < h3>クラス宣言< / h3>。

これが発生する別の場所は、[クラス宣言](https://stackoverflow.com/questions/5440036/php-parse-error-syntax-error-unexpected-t-if-expecting-t-function)です。 クラスセクションでは、プロパティの初期化とメソッドセクションのみをリストできます。 そこにコードが存在しない場合があります。

    クラスxyz {。
        if(true){{{{{}}}}}。
        foreach($ var){{{{{}}}}}。

このような構文エラーは、誤ってネストされた `{`および`}`に対して一般的に実現します。 特に、関数コードブロックが早く閉じられた場合。

3。 < h3>式コンテキストのステートメント< / h3>。

ほとんどの言語構成要素は[ステートメントとしてのみ使用できます](https://stackoverflow.com/questions/13316003/php-parse-error-syntax-error-unexpected-t-if)。 それらは他の表現の中に置かれることを意図していません:

                        ⁇ 。
    $ var = array(1、2、foreach($ else as $ _)、5、6);。

同様に、文字列、数学式、または他の場所で「if」を使用することはできません。

                    ⁇ 。
    「ああ」を印刷します。 . if(true){"あなた。!" }。 . "動かない" ;。
    //十分に精通している場合は、代わりにここで三元条件を使用します。

特に式に `if`のような条件を埋め込むには、[`を使用したいことがよくあります?: `三元評価](https://stackoverflow.com/questions/3507042/if-block-inside-echo-statement)。< / sup>。

同じことが「for」、「while」、「global」、「echo」、およびより短い拡張「list」にも当てはまります。

               ⁇ 。
    echo 123、echo 567、「ええと?";。

一方、「print()」は表現のコンテキストで使用できる組み込み言語です。 (しかし、めったに意味がありません。)。

4。 < h3>識別子として予約されたキーワード< / h3>。

また、ユーザー定義の関数やクラス名に「do」や「if」などの言語構成を使用することはできません。 (おそらくPHP7で。 しかし、それでもそれはお勧めできません。)。
解説 (0)
< h2>。 予期しないT_IS_EQUAL
。 予期しない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>。

特に、複数の比較がある「if」ステートメントの場合、[括 ⁇ の開閉]を正しくカウントするように注意する必要があります(https://stackoverflow.com/questions/4593505/php-unexpected-t-is-not-equal-error ):

                             ⁇ 。
    if(($ foo< 7)&& $ bar)> 5 || $ baz< 9){。 ... }。
                           ⁇ 。

ここで、ここでの「if」条件はすでに「)」によって終了されています。

比較が十分に複雑になると、それを複数のネストされた「if」構造に分割するのに役立ちます。

2。 < h3> isset()を比較< / h3>でマッシュ。

一般的な新人は、pitfalが[`isset()`](http://php.net/isset)または[`empty()`](http://php.net/empty)を比較と組み合わせようとしていることです。 。

                             ⁇ 。
    if(empty($ _POST ["var"] == 1)){。

または:

                         ⁇ 。
    if(isset($ variable。 !== "値")){。

「isset」と「empty」は変数名のみを受け入れる言語構成であるため、これはPHPには意味がありません。 出力はブール値にすぎないため、結果を比較することも意味がありません。

3。 < h3> & gt; =< / code>との融合 =& &&&&&&&&&&>配列演算子< / h3>。

どちらの演算子も多少似ているので、混同されることがあります。

              ⁇ 。
    if($ var => 5){。 ... }。

この比較演算子を正しくするために、この比較演算子は「*より大きい*または*等しい*」と呼ばれることを覚えておく必要があります。

参照:https://stackoverflow.com/questions/2551718/if-statement-structure-in-php。

4。 < h3>比較するものはありません< / h3>。

同じ変数名に関連する場合、2つの比較を組み合わせることもできません。

                      ⁇ 。
    if($ xyz> 5および< 100)。

PHPは、初期変数をもう一度比較するつもりだったとは推測できません。 式は通常、[演算子の優先順位](http://php.net/manual/en/language.operators.precedence.php)に従ってペアになるため、「比較チェーン< / h3>。

演算子の行を持つ変数と比較することはできません。

                       ⁇ 。
     $ reult =(5< $ x< 10);。

これは、それぞれ「$ x」に対する2つの比較に分割する必要があります。

これは実際には、ブラックリスト化された式の場合です(同等の演算子連想による)。 いくつかのCスタイル言語で構文的に有効ですが、PHPはそれを予想される比較チェーンとして解釈しません。

5。 < h3>予期しない& gt;< /コード>
予期しない& lt;< / code>< / h3>。

`>`より大きいまたは`< `未満の演算子には、カスタム `T_XXX`トークナイザー名がありません。 そして、それらは他のすべてのように見当違いになる可能性がありますが、パーサーが誤って引用された文字列とマッシュされたHTMLについてそれらについて不平を言うのをより頻繁に見ます。

                             ⁇ 。
    "< a href = 'z"> Hello< / a> ";。
                      ⁇ 。

これは、文字列 ` "< a href = 'z" `> `をリテラル定数 `Hello`と比較し、次に別の `< `比較に相当します。 または、少なくともPHPはそれを見る方法です。 実際の原因と構文の間違いは、時期 ⁇ 早の文字列 `"`終了でした。

PHP開始タグをネストすることもできません。

    <?php echo<?php my_func();。 ?>。
                ⁇ 。

参照:

-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/

解説 (0)

予期しない '?'。

nullコールセーシング演算子を使用しようとしている場合 ??PHP 7より前のバージョンのPHPでは、このエラーが発生します。

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

予期しない '?'、変数を期待しています。

次のように、無効なタイプでも同様のエラーが発生する可能性があります。

function add(?int $sum): ?int {

これは、使用されている古いPHPバージョンを示しています(CLIバージョン php -vまたはWebサーバーが1つの phpinfo();)をバインドしました)。

解説 (0)

予期しないT_LNUMBER。

トークン「T_LNUMBER」は「長い」/番号を指します。

1。 < h3>無効な変数名< / h3>。

PHPおよびその他のほとんどのプログラミング言語では、[変数](https://secure.php.net/manual/en/language.variables.basics.php)は数値で開始できません。 最初の文字はアルファベットまたはアンダースコアでなければなりません。

    $ 1 //悪い。
    $ _1 //いいね。

*。!

  • preg_replace-placebolders "$ 1"を使用するためにかなり頻繁に[comes up](https://stackoverflow.com/questions/9571559/syntax-error-unexpected-t-lnumber-expecting-t-variable-or) ' PHPコンテキストでは `。

      # ⁇ 。
      preg_replace( "/#(\ w +)/ e"、strtopupper($ 1))。

    コールバックが引用されているはずです。 (現在、「/ e」正規表現フラグは非推奨になっています。 ただし、「preg_replace_callback」関数ではまだ誤用されている場合があります。)。

*同じ識別子制約がオブジェクトプロパティに適用されます。

                ⁇ 。
        $ json-> 0->値。

*トークナイザー/パーサーでは、文字通りの「$ 1」を変数名として許可していませんが、「$ {{{1}}}」または「$ {"1"}」を使用することができます。 これは、非標準識別子の構文回避策です。 (ローカルスコープの検索と考えるのが最善です。 しかし、一般的に:そのような場合はプレーンアレイを好みます。!)。

*面白いですが、あまり推奨されていませんが、PHPパーサーはUnicode識別子を許可します。 $ ⁇が有効になるようなもの。 (文字通りの「1」とは異なり)。

2。 < h3>ストレイアレイエントリ< / h3>。

配列宣言にも予期しない長い発生する可能性があります- commas:

    # ⁇ 。
    $ xy = array(1 2 3);。

または同様に、関数呼び出しと宣言、およびその他の構成:

 * `func(1、2 3);`。
 * `function xy($ z 2);`。
 * `for($ i = 2 3< $ z)`<br><br>。

したがって、通常、リストまたは式を分離するために欠落している `; `または`、`の1つがあります。

3。 < h3>誤って引用されたHTML< / h3>。

繰り返しになりますが、[誤って引用された文字列](https://stackoverflow.com/questions/16805331/syntax-error-unexpected-t-lnumber-expecting-or)は、頻繁に発生する迷子のソースです。

    # ⁇ 。
              echo "< td colspan =" 3 "> something bad< / td>";。

このようなケースは、[予期しないT_STRING](https://stackoverflow.com/a/18092277/345031)エラーのように多かれ少なかれ処理する必要があります。

4。 < h3>その他の識別子< / h3>。

関数、クラス、または[namespaces](https://stackoverflow.com/questions/33875380/can-a-namespace-start-with-a-number-in-php/33875381)のいずれも、次のいずれかで開始して名前を付けることはできません。:

              ⁇ 。
    function 123shop(){。

変数名とほとんど同じです。
解説 (0)

予期しない '='。

これは、変数名に無効な文字が含まれていることが原因です。 変数名は、次のルールに従う必要があります。

変数名は、PHPの他のラベルと同じルールに従います。有効な変数名は、文字またはアンダースコアで始まり、その後に任意の数の文字、数字、またはアンダースコアが続きます。 正規表現として、次のように表現されます: '[a-zA-Z \ x7f- \ xff] [a-zA-Z0-9 \ x7f- \ xff] * '。

解説 (1)

予期しない「継続」(T_CONTINUE)。

continueはステートメント(for、ifなど)であり、スタンドアロンで表示する必要があります。 表現の一部として使用することはできません。 continueが値を返さないという理由もありますが、式ではすべてのサブ式がある程度の値になる必要があるため、式全体が値になります。 それがステートメントと表現の違いです。

つまり、「継続」は、3項ステートメントまたは戻り値を必要とするステートメントでは使用できません。

予期しない「ブレイク」(T_BREAK)。

もちろん「休憩」についても同様です。 また、式のコンテキストでは使用できませんが、厳密なステートメント(「foreach」または「if」ブロックと同じレベル)です。

予期しない「返品」(T_RETURN)。

これは「戻る」のほうが意外かもしれませんが、それは単なるブロックレベルのステートメントでもあります。 値(またはNULL)をより高いスコープ/関数に返しますが、式自体としては評価しません。 →つまり、「return(return(false);;」を実行しても意味がありません。

解説 (0)

予期しない「終わり」(T_ENDWHILE)##。

構文はコロンを使用しています-コロンがない場合、上記のエラーが発生します。

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

この構文の代替は、巻き毛ブラケットを使用することです。

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php

解説 (0)

Parse error:synitax error、unceptant ':'で始まるエラーメッセージは、クラス静的参照 Class :: $ VariableClass:$ Variableとして誤って記述することによって引き起こされる可能性があります。

解説 (0)