PHPの解析/構文エラー。そしてそれらを解決する方法


651

誰もが構文エラーに遭遇します。経験豊富なプログラマーでもタイプミスを犯します。初心者にとって、それは学習プロセスの一部にすぎません。ただし、多くの場合、次のようなエラーメッセージを解釈するのは簡単です。

PHP解析エラー:構文エラー、20行目のindex.phpに予期しない「{」

予期しないシンボルは、必ずしも本当の犯人ではありません。ただし、行番号は、どこから調べればよいかを大まかに示しています。

常にコードコンテキストを確認してください。文法ミスがしばしば言及さに隠れたりして、前のコード行。コードをマニュアルの構文例と比較してください。

すべてのケースが他のケースと一致するわけではありませんが。しかし、構文の誤り解決するための一般的な手順がいくつかあります。このリファレンスは、一般的な落とし穴をまとめたものです。

密接に関連する参照:

そして:

Stack Overflowも新人コーダーを歓迎していますが、主にプロのプログラミングの質問を対象としています。

  • みんなのコーディングの間違いや細かいタイプミスに答えることは、ほとんどトピックから外れていると考えられています。
  • したがって、構文修正リクエストを投稿する前に、基本的な手順に従ってください。
  • それでも必要な場合は、独自の解決策、試みられた修正、および何が外観または間違っているかについての思考プロセスを示してください。

ブラウザに「SyntaxError:不正な文字」などのエラーメッセージが表示された場合、実際には関連、しかし - 構文エラー


ベンダーコードで発生した構文エラー:最後に、コードベースを編集しても構文エラーが発生しなかった場合は、外部ベンダーパッケージのインストールまたはアップグレード後にPHPバージョンの非互換性が原因である可能性があるため、プラットフォームに対するベンダーの要件を確認してください。セットアップ。


1
これは答えになるのに十分なデータではありませんが、parsekit_compile_stringを使用してアナライザーを作成し、よりフレンドリーな答えを出すことができます。IDEに統合されている場合、これは非常に有益です。
オーウェンベレスフォード

4
あなたはこれに印象的な量の仕事を入れました。それを尊重してください。教師がエラーをすばやく指摘する方法を学ぶことや、IDEを作成したりクイックフィックスを実装したりすることは、おそらく非常に良いことです。ただし、@ Paniqueが示唆するように、IDEはこの作業のほとんどをすでに効果的に行っています。さらに、多くの場合、最初からやり直すことが適切なオプションです。
allprog 2013

1
@ Fred-ii-ほとんどの原因はT_IF / T_FOREACH / ...ブロックに似ていると思います。IF / ELSE / ELSEIFの質問について、よりカスタムな要約を作成したかったのですが。
マリオ

1
@marioこれの言い方がわかりませんが、このQ&Aは少し書き直して、もっと構造化すべきでしょうか?(一時コメント)
Rizier123

2
私が何年も前にPHPを学んでいたときに、このリストがあったといいのですが、特に初心者には非常に役立ちます。
チップスター

回答:


291

構文エラーとは何ですか?

PHPは、に属しC-スタイル命令的なプログラミング言語。厳格な文法規則があり、シンボルや識別子の配置が間違っている場合はそれを回復できません。それはあなたのコーディング意図を推測することはできません。

関数定義構文の要約

最も重要なヒント

あなたが常に取ることができるいくつかの基本的な予防策があります:

  • 適切なコードインデントを使用するか、高尚なコーディングスタイルを採用します。読みやすさが不規則性を防ぎます。

  • 構文を強調表示するIDE用のPHPまたはエディターを使用します。括弧/括弧のバランスにも役立ちます。

    予想:セミコロン

  • マニュアルの言語リファレンスと例を読んでください。2回、やや上手になります。

パーサーエラーを解釈する方法

典型的な構文エラーメッセージは次のとおりです。

解析エラー:構文エラー、予期しないT_STRING、期待;file.phpライン 217

構文の間違いの可能性のある場所を示しています。上記のファイル名行番号を参照してください。

などのモニカーT_STRINGは、パーサー/トークン化機能が最終的に処理できなかったシンボルを説明します。ただし、これが必ずしも構文の誤りの原因であるとは限りません。

以前のコード行も確認することが重要です。多くの場合、構文エラーは以前に発生した単なる事故です。エラー行番号は、パーサーが最終的にすべてを処理することを断念した場所です。

構文エラーを解決する

構文のしゃっくりを絞り込んで修正する方法はたくさんあります。

  • 上記のソースファイルを開きます。上記のコード行を見てください。

    • 暴走した文字列や誤って配置された演算子の場合、これは通常、犯人を見つける場所です。

    • 線を左から右に読み、各記号が何をするかを想像してください。

  • さらに定期的に、前の行も確認する必要があります。

    • 特に、欠落している;セミコロンは、前の行の終了/ステートメントで欠落しています。(少なくともスタイルの観点から。)

    • 場合は{、コード・ブロックが}間違って閉じまたはネストされている、あなたは、ソースコードまでも、さらに調査する必要があるかもしれません。適切なコードインデントを使用して、それを簡素化します。

  • 構文の色付けを見てください!

    • 文字列、変数、定数はすべて異なる色にする必要があります。

    • オペレーター+-*/.も明確に区別する必要があります。そうでなければ、彼らは間違った文脈にあるかもしれません。

    • 文字列の色付けが広すぎる、または短すぎる場合は、エスケープされていないか、閉じていない終了マーカー"または'文字列マーカーが見つかりました。

    • 同じ色の2つの句読文字が隣接していると、問題が発生する可能性があります。そうでない場合は通常、事業者は孤独です++--オペレータ以下、または括弧。互いに直接続く2つの文字列/識別子は、ほとんどのコンテキストで正しくありません。

  • ホワイトスペースはあなたの友達です。あらゆるコーディングスタイルに従ってください。

  • 長い行を一時的に分割します。

    • 演算子または定数と文字列の間に改行を自由に追加できます。次に、パーサーは解析エラーの行番号を具体化します。非常に長いコードを調べる代わりに、不足している、または誤って配置された構文シンボルを分離できます。

    • 複雑なifステートメントを個別のif条件またはネストされた条件に分割します。

    • 長い数式や論理チェーンの代わりに、一時変数を使用してコードを簡略化します。(より読みやすい=エラーが少ない)。

    • 間に改行を追加:

      1. 簡単に正しいと識別できるコード
      2. 不明な部分は
      3. そして、パーサーが文句を言う行。

      ロングコードブロックを分割すると、実際に構文エラーの原因を突き止めるのに役立ちます。

  • 問題のあるコードをコメント化します。

    • 問題の原因を特定できない場合は、コードのブロックをコメントアウト(および一時的に削除)してください。

    • 解析エラーを取り除くとすぐに、問題の原因がわかります。そこをもっとよく見てください。

    • 完全な関数/メソッドブロックを一時的に削除したい場合があります。(一致しない中括弧と誤ってインデントされたコードの場合。)

    • 構文の問題を解決できない場合は、コメント化されたセクションを最初から書き直してみてください。

  • 新規参入者として、混乱する構文構造のいくつかを避けてください。

    • 3項? :条件演算子はコードを圧縮できるため、非常に便利です。ただし、すべてのケースで読みやすさを向上させるわけではありません。if理解されていない間は平易な発言を好む。

    • PHPの代替構文(if:/ elseif:/ endif;)はテンプレートでは一般的ですが、通常の{コード}ブロックよりも理解しにくいことは間違いありません。

  • 最も一般的な新人の間違いは次のとおりです。

    • ;ステートメント/行を終了するためのセミコロンがありません。

    • "またはの'一致しない文字列引用符と、エスケープされていない引用符。

    • 忘れられた演算子、特に文字列の.連結。

    • (括弧がアンバランス)です。報告された行でそれらを数えます。同数ですか?

  • 1つの構文問題を解決すると、次の問題が明らかになる可能性があることを忘れないでください。

    • 1つの問題を解消しても、以下のコードで他の問題が発生する場合は、主に正しい方向に進んでいます。

    • 新しい構文エラーを編集した後、同じ行に現れた場合、試みた変更はおそらく失敗でした。(ただし、常にではありません。)

  • 修正できない場合は、以前機能していたコードのバックアップを復元します。

    • ソースコードのバージョン管理システムを採用します。あなたは常にdiff壊れた最後の作業バージョンのを見ることができます。これは構文の問題が何であるかについて啓発的かもしれません。
  • 目に見えない浮遊Unicode文字:場合によっては、ソースでhexeditorまたは別のエディター/ビューアーを使用する必要があります。コードを見ただけでは、いくつかの問題を見つけることができません。

    • grep --color -P -n "\[\x80-\xFF\]" file.php非ASCIIシンボルを見つける最初の手段として試してください。

    • 特に、BOM、ゼロ幅スペース、または改行しないスペース、およびスマートクォートは、定期的にソースコードに入ることができます。

  • ファイルに保存される改行の種類に注意してください。

    • PHPは\n改行のみを尊重し、改行を尊重しません\r

    • これは、MacOSユーザーにとっては時々問題になります(エディターの構成が不適切なOS Xでも)。

    • 単一行//または#コメントが使用されている場合、問題として表面化することがよくあります。複数/*...*/行コメントは、改行が無視されたときにパーサーを妨害することはめったにありません。

  • 構文エラーがWeb経由で送信されない場合:マシンに構文エラーがある可能性があります。ただし、まったく同じファイルをオンラインで投稿しても、そのファイルは表示されません。これは、次の2つのうちの1つのみを意味します。

    • 間違ったファイルを見ています!

    • または、コードに目に見えない浮遊Unicode(上記を参照)が含まれていました。簡単に見つけることができます。コードをWebフォームからテキストエディターにコピーします。

  • PHPのバージョンを確認してください。すべての構文構成要素がすべてのサーバーで使用できるわけではありません。

    • php -v コマンドラインインタープリター用

    • <?php phpinfo(); ウェブサーバーから呼び出されたもの。


    それらは必ずしも同じではありません。特にフレームワークで作業する場合、それらを一致させるでしょう。

  • PHPの予約済みキーワードを、関数/メソッド、クラス、または定数の識別子として使用しないでください。

  • 試行錯誤はあなたの最後の手段です。

他のすべてが失敗した場合は、いつでもエラーメッセージをグーグルできます。構文記号は検索が簡単ではありません(ただし、Stack Overflow自体はSymbolHoundによってインデックスが作成されます)。したがって、何か関連するものを見つける前に、さらに数ページを調べる必要があるかもしれません。

その他のガイド:

死の白い画面

Webサイトが空白の場合、通常は構文エラーが原因です。ディスプレイを有効にするには:

  • error_reporting = E_ALL
  • display_errors = 1

あなたにはphp.ini、一般的に、または経由.htaccessmod_phpのため、あるいは.user.iniFastCGIのセットアップと。

PHPは最初の行を解釈/実行することさえできないため、壊れたスクリプト内で有効にするのは遅すぎます。簡単な回避策は、ラッパースクリプトを作成することtest.phpです。

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

次に、このラッパースクリプトにアクセスして、失敗したコードを呼び出します。

また、PHPを有効にして、スクリプトがHTTP 500応答でクラッシュしたときにWebサーバーerror_logを調べるのにも役立ちます。error.log


error_reporting(E_ALL | E_STRICT);PHPの以前のバージョンの場合
Geo

2
一部のIDE(NetBeansなど)は、構文の強調表示だけでなく、コードのフォーマットもサポートしています。コードを適切にフォーマットし、場合によってはIDEに再フォーマットするように要求する習慣に慣れると、一致しない中括弧などの問題を見つけるのが難しくなることがあります。
Josep Valls

115

このトピックは完全に議論されすぎている/複雑すぎると思います。IDEを使用すると、構文エラーを完全に回避できます。IDEなしで作業することは、専門家ではないと言うこともできます。どうして?最新のIDEは、入力するすべての文字の後に構文をチェックするためです。コードを記述して行全体が赤くなり、大きな警告通知で構文エラーの正確なタイプと正確な位置が示される場合は、別の解決策を探す必要はまったくありません。

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

入力時に正しく表示されるという理由だけで、構文エラーが(事実上)二度と発生することはありません。真剣に。

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

  1. NetBeans [無料]
  2. PHPStorm [199米ドル]
  3. PHPプラグインを備えたEclipse [無料]
  4. Sublime [$ 80 USD](主にテキストエディターですが、PHP Syntax Parserなどのプラグインで拡張可能)

2
それは明らかにです。ただし、ここでIDEを再リストします。構文の有用性が異なるIDEについて少し詳しく説明できますか?Sublimeは、ほとんどがIDEではなくエディタです。しかし、それから、より美しく、きびきびとした。主に構文の強調表示だけを行いますが、ブラケットのマッチングでも真実です。たとえば、PHPStormとは異なり、T_CONSTANT_AND_ENCAPSEDエラーを即座に簡単に発見できます。ただし、インラインエラーの方が波線が長くなります。NetBeansの構文ヒントは、以前はPHPよりも暗号化されていました(許可された構成の再リスト)。長所/短所での経験を共有できますか?あなたの好きなEclipse / PDTですか。
マリオ

@mario私はあなたがトピックに本当に深いと思うので、私はここで何も間違ったことを言いたくないのですが、私(そして私のチームメイト、コードを書く友人、フリーランスのパートナー)がこれまでにIDEで書いたすべてのコードは決して実行されませんでした構文エラーが発生しました。したがって、少なくともNetbeans / PHPStormの構文チェックは非常に強力だと思います。しかし、多分私はあなたの質問を誤解しました。Gimme数時間...;)
Sliq 2013

あなたの答えはすでに出ています。私たちの質問の99%に当てはまるでしょう。ただし、ここでのコンテキストでは、どのIDEが初心者向けのツールチップを提供するかについて、トレードオフの考慮事項が必要です。おそらく私たちにとってはマイナーなものです。十分に精通していれば、カラー化と波線で十分です。ただし、初心者にとっては、その違いがより重要になると思います。
マリオ

IDEが実現可能なオプションではない場合があります。たとえば、WordPressテーマやプラグインをすばやく編集します。はい、すべてのコードをIDEにコピーできますが、それを開いて、そこにすべて貼り付け、ヘッダーを設定し、その他すべての時間を無駄にする必要があります。簡単な編集を期待しているだけです。新しい機能を開発している場合、またはゼロから始めている場合は、そうです。そうすれば、IDEでそれを実行できます。セットアップに最初に少し時間をかけて後悔することはありません。
1934286

IDEは単なるツールボックスではなく、予告編だと思っています。修正できない場合もありますが、構文エラーを見つけて防止するのに役立ちます。ここでの多くの答えは、コードをクリーンに保つと、エラーが発生する可能性が低くなり、発見が容易になるということです。自動インデント、コードヒント、変数の出現、自動終了の角かっこ、および自動書式設定を使用すると、1日に多くのタイプミスを節約でき、これを使用する主な利点です。これは、この質問の範囲を超える他のすべて(デバッガ、データベースコネクタ、UML図など)を数えていません。IDEは時間を節約し、構文エラー以上のものを防ぎます。
Louis Loudog Trottier 2017

58

予期せぬ [

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

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

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

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

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

ただし、PHPインストールをアップグレードするだけの方が常に得策です。共有ウェブホスティングプランの場合、たとえばSetHandler php56-fcgi、新しいランタイムを有効にするために使用できるかどうかを最初に調査します。

以下も参照してください。

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

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

PHPのバージョンの不一致でない場合は、多くの場合、単純なタイプミスまたは新人の構文ミスです。

  • PHP 7でも、クラスの配列プロパティの宣言/式を使用することはできません。

    protected $var["x"] = "Nope";
                  
  • [中括弧{または括弧を開くことと混同すること(は一般的な見落としです。

    foreach [$a as $b)
            

    あるいは:

    function foobar[$a, $b, $c] {
                   
  • または、配列として定数(PHP 5.6より前)を逆参照しようとしています:

    $var = const[123];
           

    少なくともPHPはそれconstを定数名として解釈します。

    配列変数にアクセスするつもりである場合(これがここでの一般的な原因です)、先頭の$シギルを追加し$varnameます。そうすると、になります。

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

    global $var['key'];


予期しない] 閉じ角括弧

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

  • )かっこまたは}中かっことの不一致がよくあります。

    function foobar($a, $b, $c] {
                              
  • または、存在しない配列を終了しようとしています:

    $var = 2];

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

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 

    その場合は、ブラケットマッチングにIDEを使用して、早期の]配列クロージャーを見つけます。少なくとも、より多くの間隔と改行を使用して絞り込みます。


上記のリンク「PHP 5.4構文ダウンコンバーター」github.com/IonutBajescu/short-arrays-to-long-arraysは壊れています。
Danimal Reks

46

予期しないT_VARIABLE

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

意図的に抽象化/不正確な演算子+ $変数図

  1. セミコロンがありません

    最も一般的には、前の行にセミコロンないことを示しています。ステートメントに続く変数の割り当ては、どこを見ればよいかを示す良い指標です。

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. 文字列の連結

    よくある事故は、忘れられた演算子による文字列連結.です。

                                   
    print "Here comes the value: "  $value;

    ところで、読みやすさを向上させるときはいつでも、文字列補間(二重引用符で囲まれた基本変数)を優先する必要があります。これらの構文の問題を回避します。

    文字列補間は、スクリプト言語のコア機能です。それを利用することに恥はありません。変数の.連結の高速化に関するマイクロ最適化のアドバイスを無視します。そうではありません。

  3. 式演算子がありません

    もちろん、同じ問題が他の式、たとえば算術演算でも発生する可能性があります。

               
    print 4 + 7 $var;

    PHPは、変数が追加、減算、比較などされるべきかどうかをここで推測することはできません。

  4. リスト

    構文リストの場合と同様に、配列の母集団と同様に、パーサーは予想されるコンマも示します,。次に例を示します。

                                          
    $var = array("1" => $val, $val2, $val3 $val4);

    または関数のパラメーターリスト:

                                    
    function myfunc($param1, $param2 $param3, $param4)

    同様に、listor globalステートメントを使用して、またはループに;セミコロンがないときに、これを確認しforます。

  5. クラス宣言

    このパーサーエラーは、クラス宣言でも発生ます。式ではなく、静的定数のみを割り当てることができます。したがって、パーサーは割り当てられたデータとして変数について不平を言います:

    class xyz {      
        var $value = $_GET["input"];

    比類のない}閉じ中かっこは、ここで特にリードできます。メソッドの終了が早すぎる場合は(適切なインデントを使用してください!)、通常、浮遊変数がクラス宣言本体に誤って配置されます。

  6. 識別子の後の変数

    また、変数を識別子に直接従わせることはできません。

                 
    $this->myFunc$VAR();

    ところで、これはおそらく変数変数を使用することを意図した一般的な例です。この場合、$this->{"myFunc$VAR"}();たとえばを使用した可変プロパティのルックアップ。

    変数変数の使用は例外であることを覚えておいてください。初心者は、配列がより単純で適切である場合でも、あまりにもさりげなく使用しようとすることがよくあります。

  7. 言語構成後の括弧の欠落

    急いで入力するiffor、and およびand foreachステートメントの左括弧または左括弧が忘れられる可能性があります。

           
    foreach $array as $key) {

    解決策:(ステートメントと変数の間に欠落している開始を追加します。

                          
    if ($var = pdo_query($sql) {
         $result = 

    {括弧は、コードブロックを開きません。最初に右括弧でif式を閉じなければなりません)

  8. それ以外の場合は条件を想定していません

         
    else ($var >= 0)

    解決策:から条件を削除するelseか、を使用しますelseif

  9. 閉鎖用のブラケットが必要

         
    function() uses $var {}

    解決策:を括弧で囲みます$var

  10. 見えない空白

    「Invisible stray Unicode」(改行しないスペースなど)に関するリファレンスの回答で述べたように、次のような疑わしくないコードに対してもこのエラーが表示される場合があります。

    <?php
                              
    $var = new PDO(...);

    これは、ファイルの先頭やコピーアンドペーストされたコードでかなり一般的です。コードに構文上の問題が含まれていないように見える場合は、hexeditorで確認してください。

こちらもご覧ください


32

予期しないT_CONSTANT_ENCAPSED_STRING
予期しないT_ENCAPSED_AND_WHITESPACE

扱いにくい名前T_CONSTANT_ENCAPSED_STRINGT_ENCAPSED_AND_WHITESPACE引用されたリテラルを参照します"string"

それらは異なるコンテキストで使用されますが、構文の問題は非常に似ています。T_ENCAPSED…警告は、二重引用符で囲まれた文字列コンテキストで発生しますが、T_CONSTANT…文字列は、プレーンなPHP式またはステートメントでしばしば誤解されます。

  1. 不正な変数補間

    そして、それは不適切なPHP変数補間で最も頻繁に発生します。

                                   
    echo "Here comes a $wrong['array'] access";

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

    より正確に、配列参照の二重引用符内で PHP2スタイルの単純な構文を使用することが有効です。

    echo "This is only $valid[here] ...";

    ただし、ネストされた配列またはより深いオブジェクト参照には、複雑な巻き文字列式の構文が必要です。

    echo "Use {$array['as_usual']} with curly syntax.";

    よくわからない場合は、通常これを使用する方が安全です。多くの場合、読みやすさも考慮されています。そして、より良いIDEは、実際にそのために明確な構文の色分けを使用します。

  2. 連結がありません

    文字列が式の後に続くものの、連結またはその他の演算子がない場合、PHPは文字列リテラルについて不平を言うでしょう。

                           
    print "Hello " . WORLD  " !";

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

  3. 紛らわしい文字列引用囲み

    文字列区切り文字を混乱させるときにも同じ構文エラーが発生します。一'"引用符または二重引用符で始まる文字列も同じで終わります。

                    
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

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

    ヒント:一重引用符と二重引用符で囲まれた文字列にわずかに異なる色付けを使用するようにエディター/ IDEを設定します。(これは、たとえば、テキスト出力に二重引用符で囲まれた文字列、および定数のような値にのみ単一引用符で囲まれた文字列を優先するアプリケーションロジックにも役立ちます。)

    これは、最初に二重引用符から抜け出してはならない良い例です。代わりに、HTML属性の引用符に適切な\"エスケープを使用してください

    print "<a href=\"{$link}\">click here</a>";

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

  4. 冒頭の引用がありません

    同様に、パーサーエラーのレシピを開く"/ '引用することを忘れています

                   
     make_url(login', 'open');

    ここで', '明らかloginには文字列パラメータであることを意図していたが、ベアワードの後の文字列リテラルになる。

  5. 配列リスト

    ,配列作成ブロックでコンマを逃した場合、パーサーは2つの連続した文字列を参照します。

    array(               
         "key" => "value"
         "next" => "....",
    );

    最後の行には常に余分なコンマが含まれている可能性がありますが、その間の1つを見落とすことは許されないことに注意してください。これは構文の強調表示なしでは発見するのが難しいです。

  6. 関数パラメーターリスト

    関数呼び出しについても同じです。

                             
    myfunc(123, "text", "and"  "more")
  7. 暴走ストリング

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

                                    
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

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

こちらもご覧ください


27

予期しないT_STRING

T_STRING少し誤称です。引用されたものを指すのではありません"string"。これは、未加工の識別子が検出されたことを意味します。これは、bare単語から残り物CONSTANTまたは関数名、引用符で囲まれていない忘れられた文字列、またはプレーンテキストまでさまざまです。

  1. 誤って引用された文字列

    この構文エラーは、誤って引用された文字列値の場合に最もよく見られます。エスケープされておらず、はぐれ"たり'引用したりすると、無効な式になります。

                                     
     echo "<a href="http://example.com">click here</a>";

    構文の強調表示は、そのような間違いを非常に明白にします。\"二重引用符または\'一重引用符をエスケープする場合は、バックスラッシュを使用することを忘れないでください。どちらが文字列の囲みとして使用されたかによって異なります

    • 便宜上、二重引用符を含むプレーンHTMLを出力する場合は、外側の単一引用符を優先する必要があります。
    • 変数を補間する場合は二重引用符付きの文字列を使用しますが、リテラルの"二重引用符のエスケープには注意してください。
    • 出力を長くするには、エスケープインおよびエスケープするのではなく、複数のecho/ print行を優先します。HEREDOCセクションを検討することをお勧めします。

    別の例は、PHPで生成されたHTMLコード内でPHPエントリを使用することです。

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    これは、$text行数が多く、開発者がPHP変数の値全体を確認せず、ソースを忘れているコードに集中している場合に発生します。例はこちら

    PHPでの単一引用符付き文字列と二重引用符付き文字列の違いは何ですか?も参照してください

  2. 閉じられていない文字列

    クロージング"逃した場合通常は構文エラーが後で発生します。終端されていない文字列は、次に意図する文字列値になるまで、コードのビットを消費することがよくあります。

                                                           
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    T_STRINGパーサーが抗議するのは単なるリテラルではありません。もう1つのよくあるバリエーションは、Unexpected '>'引用符で囲まれていないリテラルHTMLです。

  3. 非プログラミング文字列の引用

    ブログやウェブサイトからコードをコピーして貼り付けると、無効なコードになる場合があります。表記上の引用は、PHPが期待するものではありません

    $text = Something something..’ + these ain't quotes”;

    活版印刷/スマート引用符はUnicode記号です。PHPは、それらを隣接する英数字テキストの一部として扱います。たとえば”these、定数識別子として解釈されます。ただし、その後のテキストリテラルは、パーサーによってベアワード/ T_STRINGとして認識されます。

  4. 欠落しているセミコロン。再び

    前の行に終了していない式がある場合、次のステートメントまたは言語構成はすべて生の識別子と見なされます。

           
    func1()
    function2();

    PHPは、2つの関数を次々に実行するつもりなのか、結果を乗算するのか、それらを追加するのか、比較するのか、どちらか一方だけを実行するのなの||か、わかりません。

  5. <?xmlPHPスクリプトの短いオープンタグとヘッダー

    これはかなり珍しいことです。しかし、short_open_tagsが有効になっている場合、PHPスクリプトをXML宣言で始めることはできません。

          
    <?xml version="1.0"?>

    PHPはを見て<?、それ自体を取り戻します。それは、迷走xmlが何のために意図されたかを理解しません。定数として解釈されます。しかし、これversionは別のリテラル/定数と見なされます。また、パーサーは、間に式演算子がないと、後続の2つのリテラル/値を理解できないため、パーサーエラーになります。

  6. 非表示のUnicode文字

    構文エラーの最も恐ろしい原因は、改行しないスペースなどのUnicodeシンボルです。PHPでは、識別子名としてUnicode文字を使用できます。次のような完全に疑わしくないコードについてT_STRINGパーサーのクレームを受け取った場合:

    <?php
        print 123;

    別のテキストエディタを作成する必要があります。またはhexeditorさえ。ここでは単純なスペースと改行のように見えますが、目に見えない定数が含まれている可能性があります。JavaベースのIDEは、内部で改ざんされたUTF-8 BOM、ゼロ幅スペース、段落セパレーターなどに気付かない場合があります。すべてを再編集して、空白を削除し、通常のスペースを元に戻します。

    ;各行の先頭に冗長なステートメントセパレータを追加することで、それを絞り込むことができます。

    <?php
        ;print 123;

    ここで追加の;セミコロンは、前の非表示の文字を未定義の定数参照(式としてのステートメント)に変換します。これにより、PHPは有益な通知を生成します。

  7. 変数名の前に `$`記号がない

    PHPの変数は、ドル記号とそれに続く変数名で表されます。

    ドル記号は、( $)であるシギルそのマーク変数の名前などの識別子。この印がなければ、識別子は言語のキーワードまたは定数になる可能性があります

    これは、PHPコードが別の言語(C、Java、JavaScriptなど)で記述されたコードから「変換」された場合の一般的なエラーです。このような場合、変数の型の宣言(元のコードが型付き変数を使用する言語で記述されている場合)もこっそりとこのエラーを生成する可能性があります。

  8. エスケープされた引用符

    \文字列で使用する場合、特別な意味があります。これは「エスケープ文字」と呼ばれ、通常、次の文字を文字どおりに受け取るようパーサーに指示します。

    例:echo 'Jim said \'Hello\'';印刷されますJim said 'hello'

    文字列の終了引用符をエスケープすると、終了引用符は文字どおりに解釈され、意図したとおりにはなりません。つまり、文字列の一部として印刷可能な引用符として解釈され、文字列を閉じません。これは通常、次の文字列を開いた後またはスクリプトの最後に解析エラーとして表示されます。

    Windowsでパスを指定する際の非常に一般的なエラー:"C:\xampp\htdocs\"が間違っています。あなたが必要"C:\\xampp\\htdocs\\"です。


18

予期せぬ (

左括弧は通常、if/ foreach/ for/ array/ などの言語構造に続くlistか、算術式を開始します。後"strings"、前()、後$、およびいくつかの典型的な宣言コンテキストでは、構文的に正しくありません。

  1. 関数宣言パラメーター

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

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

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

  2. クラスプロパティのデフォルト

    同じことクラスのメンバ宣言のみリテラル/定数値が許可されている、ではない表現:

    class xyz {                   
        var $default = get_config("xyz_default");

    そのようなものをコンストラクタに入れます。PHP属性で関数が許可されないのはなぜですか?も参照してください

    ここでも、PHP 7ではvar $xy = 1 + 2 +3;定数式しか使用できないことに注意してください。

  3. PHPのJavaScript構文

    JavaScriptまたはjQuery構文を使用しても、明らかな理由によりPHPでは機能しません。

    <?php      
        print $(document).text();

    これが発生した場合、通常、前の文字列が終了していないことを示しています。<script>PHPコードコンテキストにリークするリテラルセクション。

  4. isset(())、空、キー、次、現在

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

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

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

    変数参照を必要とするが、式の結果が渡されるユーザーレベルの関数は、代わりに実行時エラーを引き起こします。


予期せぬ )

  1. 不在関数パラメーター

    関数呼び出しの最後に浮遊コンマを含めることはできません。PHPはそこに値を期待しているため、初期の閉じ)括弧について文句を言っています。

                  
    callfunc(1, 2, );

    末尾のコンマは、array()またはlist()構文でのみ使用できます。

  2. 未完成の表現

    算術式で何かを忘れた場合、パーサーはあきらめます。それはどうやってそれを解釈するべきでしょうか?

                   
    $var = 2 * (1 + );

    そして、もしあなたが終わりを忘れたなら、あなたは)代わりに予期しないセミコロンについて不平を受け取るでしょう。

  3. foreach as constant

    以下のために忘れて、可変$制御文の接頭辞あなたが表示されます。

                           
    foreach ($array as wrong) {

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


予期せぬ {

中括弧{}コードブロックを囲みます。そして、それらに関する構文エラーは通常、いくつかの不正なネストを示しています。

  1. の一致しない部分式 if

    最も一般的には不均衡で(あり)、パーサーがオープニングカーリーの{出現が早すぎると文句を言う場合の原因です。簡単な例:

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

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

  2. 式のコンテキストでの{および}

    式では中括弧は使用できません。括弧と中括弧を混同すると、言語の文法に準拠しなくなります。

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

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

  3. 変数変数またはcurly var式

    これはかなりまれです。ただし、複雑な変数式のパーサーを取得{して}パーサーにすることもできます。

                          
    print "Hello {$world[2{]} !";

    その}ような状況では予期しない可能性が高くなりますが。


予期せぬ }

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

  1. コードブロックの最後のステートメント

    終了していない式で発生する可能性があります。

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

    function whatever() {
        doStuff()
    }            

    ここで、パーサーは、おそらく+ 25;関数の結果に何か追加したいのかどうかを判断できません。

  2. 無効なブロックのネスト/忘れた {

    コードブロックが}早すぎて閉じられたとき、またはオープニングを忘れたときにも、このパーサーエラーが表示されることがあります{

    function doStuff() {
        if (true)    
            print "yes";
        }
    }   

    上記のスニペットでifは、開始{中括弧はありませんでした。したがって、}以下の最後のものは冗長になりました。そのため、}この機能を対象とした次のクロージングは、元のオープニングと関連付けることができませんでした{中括弧に。

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


予期せぬ{、期待(

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

  1. パラメータリスト

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

                     
    function whatever {
    }
  2. 制御ステートメントの条件

    そして、あなたは同様に持つことができないif条件なし

      
    if {
    }

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

    この特定のエラーが発生した場合は、手動の例を必ず調べてください。


1
この投稿で私の質問への回答を探していましたが、「予期しない{」という問題に対する自分自身の回答が見つかりました。それが私が私の回答と共有したかった理由です。私にとって問題は改行エンコーディングでした-どういうわけか私のファイルはmacintoshの改行を使用していましたが、Windowsの改行に変更すると、私の問題(localhost(WAMP)ではすべてが機能しますが、Linux Webサーバーでは不可)が解決されました。
Edgars Aivars 2017

@EdgarsAivarsコメントありがとうございます!プラットフォーム固有の改行は、実際には珍しいトリッキーな問題です。おそらくここでも触れておきます。(それはちょうどに脇として言及された他の参照の答え。)
マリオ

Unexpected}を取得したのは、私のコードの一部がphp shortタグを使用したためです<?<?phpの代わりに-他のサーバーで動作していたため、これを見つけるのにしばらく時間がかかりました。
c7borg

14

予期しない$ end

PHPが「予期しない$end」について話すときは、コードが途中で終了したことを意味します。(このメッセージは、文字どおりに解釈すると少し誤解を招く可能性があります。「$ end」という名前の変数に関するものではありません。新規参入者が想定することもありますEOF。「ファイルの終わり」を指します。)

原因:不均衡{}、コードブロック/および関数またはクラスの宣言に使用されています。

それはですほとんど常に欠けについて}上記のコード・ブロックを閉鎖する中括弧。

  • この場合も、このような問題を回避するために適切なインデントを使用してください。

  • ブラケットマッチングを備えたIDEを使用して、どこに}誤りがあるかを見つけます。ほとんどのIDEおよびテキストエディタにはキーボードショートカットがあります。

    • NetBeans、PhpStorm、Komodo:Ctrl[およびCtrl]
    • Eclipse、Aptana: CtrlShiftP
    • Atom、Sublime:Ctrlm-Zend StudioCtrlM
    • Geany、Notepad ++:CtrlB-Joe:CtrlG-Emacs:C-M-n-Vim:%

ほとんどのIDEは、一致する中括弧、大括弧、および括弧も強調表示します。これにより、それらの相関関係を簡単に検査できます。

IDEでの括弧の一致

終了していない式

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

  • $var = func(1, ?>EOF

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

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

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

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

したがって、パーサーは、ファイルの終わりまで(したがって「予期しない$ end」)、HEREDOC文字列が続くと想定します。ほとんどすべてのIDEおよび構文強調エディタは、これを明白にするか、警告します。

エスケープされた引用符

\文字列で使用する場合、特別な意味があります。これは「エスケープ文字」と呼ばれます」と通常、次の文字を文字どおりに受け取るようパーサーに指示します。

例:echo 'Jim said \'Hello\'';印刷されますJim said 'hello'

文字列の終了引用符をエスケープすると、終了引用符は文字どおりに解釈され、意図したとおりにはなりません。つまり、文字列の一部として印刷可能な引用符として解釈され、文字列を閉じません。これは通常、次の文字列を開いた後またはスクリプトの最後に解析エラーとして表示されます。

Windowsでパスを指定する際の非常に一般的なエラー:"C:\xampp\htdocs\"が間違っています。あなたが必要"C:\\xampp\\htdocs\\"です。

代替構文

テンプレートでステートメント/コードブロックの代替構文を使用すると、この構文エラーが表示されることはまれです。ととがif:ありelse:ませんendif;たとえばをします。

以下も参照してください。


14

予期しないT_IF
予期しないT_ELSEIF
予期しないT_ELSE
予期しないT_ENDIF

条件付き制御ブロックifelseifおよびelse単純な構造に従います。構文エラーが発生した場合は、ブロックの入れ子が無効である可能性が高い→ {中括弧がないか、中括弧が}多すぎる。

ここに画像の説明を入力してください

  1. 欠落{または}不正確なインデントのために

    不一致のコード中括弧は、以下のようなあまりフォーマットされていないコードによく見られます。

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

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

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

    if (true) {
         if (false) {
                  
         }
         elseif ($whatever) {
             if ($something2) {
                 
             } 
             else {
                 
             }
         }
         else {
             
         }
         if (false) {    //   a second `if` tree
             
         }
         else {
             
         }
    }
    elseif (false) {
        
    }

    double } }はブランチを閉じるだけでなく、以前の条件構造を閉じます。したがって、1つのコーディングスタイルを使用してください。入れ子になったif / elseツリーで混合して一致させないでください。

    ここでの一貫性とは別に、長い状態を避けることも役立ちます。一時的な変数または関数を使用して、読み取り不能を回避するifます。

  2. IF 式では使用できません

    驚くほど頻繁に発生する初心者の間違いはif、printステートメントなどの式でステートメントを使用しようとすることです。

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

    もちろんこれは無効です。

    3項条件付きを使用できますが、読みやすさへの影響に注意してください。

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

    それ以外の場合は、このような出力構成を分割します。複数を使用しますif sおよびechosの
    さらに良いのは、一時変数を使用し、前に条件を配置することです。

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";

    そのような場合のために関数またはメソッドを定義することもしばしば意味があります。

    制御ブロックが「結果」を返さない

    これはあまり一般的ではありませんが、一部のコーダーは if結果を返す可能性があるかのようます。

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

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

    • だが 制御構造(if / foreach / while)には「結果」がありません
    • リテラル文字列「true」もvoidステートメントになります。

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

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

    または、?:3項比較を使用します。

    イフの場合

    次のいずれかを条件内にネストするifことはできません

                        
    if ($x == true and (if $y != false)) { ... }

    and(またはor)はすでにチェーン比較を許可しているため、これは明らかに冗長です。

  3. 忘れられた ;セミコロン

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

                    
    $var = 1 + 2 + 3
    if (true) {  }

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

  4. セミコロンが早すぎます

    この落とし穴は見過ごされがちなので、特定のコーディングスタイルを非難することはおそらく間違っています。

                
    if ($x == 5);
    {
        $y = 7;
    }
    else           
    {
        $x = -1;    
    }

    これは想像以上に頻繁に起こります。

    • とき、あなたは終了if ()と表現し;、それが空のステートメントを実行します。;空になった{}、独自の!
    • {…}したがって、ブロックはから切り離され、if常に実行されます。
    • そのelseため、はオープンifコンストラクトとの関係がなくなったため、予期しないT_ELSE構文エラーが発生しました。

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

    if ($x) { x_is_true(); }; else { something_else(); };

    どこ;のコードの後にブロックが{…}全体終了if 切断、構造をelse構文的にブランチを。

  5. コードブロックを使用しない

    構文的に中括弧を省略できます{… / /の}コードブロックifelseifelseブランチ。残念ながら、これは、非知向のプログラマーに非常に一般的な構文スタイルです。(誤った仮定の下では、これは入力または読み取りがより高速でした)。

    ただし、構文が誤って実行される可能性が高くなります。遅かれ早かれ、追加のステートメントがif / elseブランチに入るでしょう:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     
    else
        $z = 0;

    しかし、実際にコードブロックを使用するには、持っている書き込みに{... }など、それらを!

    熟練したプログラマーでさえ、このブレスな構文を回避するか、少なくともそれを規則の例外として理解します。

  6. Else / Elseifの順序が間違っている

    もちろん、覚えておくべきことは、条件付き順序です。

    if ($a) {  }
    else {  }
    elseif ($b) {  }
    

    はいくつでも持つことができelseifますが、else最後に行く必要があります。それがまさにそれです。

  7. クラス宣言

    上記の、あなたはクラス宣言で制御ステートメントを持つことはできません。

    class xyz {
        if (true) {
            function ($var) {}
        }

    関数定義を忘れた}、そのような場合には早く定義を閉じました。

  8. 予期しないT_ELSEIF / T_ELSE

    PHPとHTMLを混合するとき、閉鎖}のためには、if/elseif同じPHPブロック内にある必要があり<?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 } ?>

    これは多かれ少なかれ、正しくないインデントのバリエーションです-おそらく多くの場合、間違ったコーディング意図に基づいています。
    あなたはできません他の文マッシュ挟ん ifおよびelseif/ else構造的なトークンを:

    if (true) {
    }
    echo "in between";    
    elseif (false) {
    }
    ?> text <?php      
    else {
    }

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

    • これはとにかく意味がありません。PHPがブランチifelseブランチの間をジャンプするときに「未定義」状態があったのとは異なります。
    • printステートメントがどこに属しているか、または両方のブランチで繰り返す必要があるかどうかを判断する必要があります。

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

    foreach ($array as $i) {
        if ($i) {  }
    }
    else {  }

    何もありません統語的関係の間ifとはelseforeachレキシカルスコープの端は}、そのためにはポイントがないif構造が継続します。

  9. T_ENDIF

    予期せぬT_ENDIFが文句を言っている場合は、別の構文を使用しているスタイルif:elseif:else:⋯をendif;。あなたは本当に二度考えるべきです。

    • よくある落とし穴は、不気味に似た:コロンを;セミコロンと混同していることです。(「セミコロンが早すぎる」で取り上げられました)

    • インデントはテンプレートファイルで追跡するのが難しいので、代替構文を使用する場合はさらに多くなります- endif;一致しない可能性がありますif:

    • 使用} endif;二重の ifターミネーターです。

    「予期しない$ end」は通常、忘れられた閉じ}中括弧の価格です。

  10. 割り当てと比較

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

           
    if ($x = true) { }
    else { do_false(); }

    これは==/ ===比較ではなく、=代入です。これはやや微妙であり、一部のユーザーを無条件で条件ブロック全体を編集するように導くでしょう。最初に意図しない割り当てに注意してください-論理障害/誤動作が発生したときはいつでも。


11

予期しないT_IS_EQUAL
予期しないT_IS_GREATER_OR_EQUAL
予期しないT_IS_IDENTICAL
予期しないT_IS_NOT_EQUAL
予期しないT_IS_NOT_IDENTICAL
予期しないT_IS_SMALLER_OR_EQUAL
予期し<
ない予期しない>

などの比較演算子は==>====!=<>!==および<=または<および>ほとんどのような、ちょうど式で使用されなければならないif表現。パーサーがそれらについて文句を言う場合、それはしばしば( )それらの周りの不正確なペアリングまたは不一致の括弧を意味します。

  1. 括弧のグループ化

    特に、if複数の比較があるステートメントの場合、開始括弧と終了括弧を正しく数えるように注意する必要があります

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

    ここで、ここのif状態はすでに)

    比較が十分に複雑になると、多くの場合、比較を複数のネストされたif構成に分割するのに役立ちます。

  2. isset()は比較とマッシュアップ

    一般的な新参者は、pitfalが比較isset()またはempty()比較しようとしていることです。

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

    あるいは:

                        
    if (isset($variable !== "value")) {

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

  3. 混乱>=と等しいより大きい、または、=>配列演算子

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

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

    あなただけのこの比較演算子が」と呼ばれていることを覚えておく必要がより大きい等しいです右にそれを得るために」。

    参照:PHPのifステートメント構造

  4. 比較するものはありません

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

                     
    if ($xyz > 5 and < 100)

    PHPは、初期変数をもう一度比較するつもりであると推定できません。式は通常、演算子の優先順位に従ってペアになっているため<、が表示されるまでに、元の変数から残っているブール結果のみが残ります。

    参照:予期しないT_IS_SMALLER_OR_EQUAL

  5. 比較チェーン

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

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

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

    これは実際には、ブラックリストに記載された式のより多くのケースです(同等の演算子結合性のため)。いくつかのCスタイル言語では構文的に有効ですが、PHPはこれを期待される比較チェーンとして解釈しません。

  6. 予期>
    せぬ<

    大なり演算子>または小なり<演算子には、カスタムT_XXXトークナイザー名はありません。そして、それらは他のすべてのように誤った場所に置かれる可能性がありますが、パーサーが誤って引用符で囲まれた文字列とマッシュされたHTMLについてそれらについて不平を言うことがよくあります。

                            
    print "<a href='z">Hello</a>";
                     ↑

    これは、文字列"<a href='z">リテラル定数Helloと比較され、次に別の<比較が行われることを意味します。または、少なくともPHPはそれを認識しています。実際の原因と構文の間違いは時期尚早の文字列でした"終了しです。

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

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

以下も参照してください。


11

予期しないT_IF
予期しないT_FOREACH
予期しないT_FOR
予期しないT_WHILE
予期しないT_DO
予期しないT_ECHO

コントロールが構築などifforeachforwhilelistglobalreturndoprintecho唯一のステートメントとして使用することができます。彼らは通常、一人で列に住んでいます。

  1. セミコロン; どこにいるの?

    かなり普遍的にあなたを持っています パーサーが制御ステートメントについて不平を言った場合、前の行のセミコロン見逃しました

                 
    $x = myfunc()
    if (true) {

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

  2. クラス宣言

    これが発生する別の場所は、クラス宣言です。クラスセクションでは、プロパティの初期化とメソッドセクションのみを一覧表示できます。そこにコードを置くことはできません。

    class xyz {
        if (true) {}
        foreach ($var) {}

    このような構文エラーは一般に、正しくネストされていないために発生し{}。特に、関数コードブロックが早く終了した場合。

  3. 式のコンテキストでのステートメント

    ほとんどの言語構造は、ステートメントとしてのみ使用できます。これらは他の式の中に配置することを意図していません:

                       
    $var = array(1, 2, foreach($else as $_), 5, 6);

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

                   
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    if式のような条件を具体的に埋め込むには、多くの場合、?:3項評価を使用します。

    同様に当てはまりforwhileglobalechoおよびより少ない延びますlist

              
    echo 123, echo 567, "huh?";

    一方、print()は式のコンテキストで使用できる組み込み言語です。(しかし、ほとんど意味がありません。)

  4. 識別子としての予約済みキーワード

    doまたはif、ユーザー定義の関数またはクラス名に、またはその他の言語構成要素を使用することもできません。(おそらくPHP 7ですが、それでもお勧めできません。)


7

予期しない「?」

??PHP 7より前のバージョンのPHPでnull合体演算子を使用しようとすると、このエラーが発生します。

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

予期しない「?」、変数が必要です

次のように、null許容型でも同様のエラーが発生する可能性があります。

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

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


5

予期しないT_LNUMBER

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

  1. 無効な変数名

    PHPや他のほとんどのプログラミング言語では、変数の先頭に数字は使用できません。最初の文字は英字またはアンダースコアでなければなりません。

    $1   // Bad
    $_1  // Good

    *

    • PHPコンテキストで-placeholders を使用すること非常によくあります。preg_replace"$1"

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )

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

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

             
      $json->0->value
    • トークナイザー/パーサーではリテラル$1を変数名として使用できませんが、またはを使用できます。これは、非標準の識別子の構文上の回避策です。(それをローカルスコープルックアップと考えるのが最善です。しかし、一般的に:そのような場合はプレーン配列を好んでください!)${1}${"1"}

    • おかしいですが、あまりお勧めできませんが、PHPパーサーではUnicode識別子を使用できます。それ$➊は有効でしょう。(リテラルとは異なります1)。

  2. ストレイアレイエントリー

    配列宣言でも予期しないlongが発生する可能性があります- ,コンマがない場合:

    #            ↓ ↓
    $xy = array(1 2 3);

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

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    したがって、通常、リストまたは式を分離するための1つ;または,不足しています。

  3. 誤って引用されたHTML

    繰り返しになりますが、誤って引用された文字列は、迷走数の頻繁な原因です。

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

    このような場合は、多かれ少なかれ予期しないT_STRINGエラーと同様に処理する必要があります。

  4. その他の識別子

    関数、クラス、名前空間のいずれにも、数字で始まる名前を付けることはできません。

             
    function 123shop() {

    変数名の場合とほとんど同じです。


2

予期しない「=」

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

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


いい加減なジョン。
Funk Forty Niner、2018

1

予期しない「続行」(T_CONTINUE)

continueステートメント(forまたはifなど)であり、スタンドアロンで表示する必要があります。式の一部として使用することはできません。1つには、continueが値を返さないためですが、式では、すべての部分式が何らかの値になる必要があるため、式全体で値が得られます。それがステートメントと式の違いです。

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

予期しない「中断」(T_BREAK)

break;もちろん同じです。また、式のコンテキストでは使用できませんが、厳密なステートメント(foreachまたはifブロックと同じレベル)です。

予期しない 'return'(T_RETURN)

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


1

予期しない「。」

これは、サポートされていないバージョンのPHPでsplat演算子(...を使用しようとしている場合に発生する可能性があります。

... PHP 5.6で最初に使用できるようになったのは、関数への引数の可変数をキャプチャするためです。

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

PHP 7.4では、配列式に使用できます。

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

0

予期しない「endwhile」(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: syntax error, unexpected ':'、クラスの静的参照Class::$Variableを誤ってとして書き込んだことが原因である可能性がありますClass:$Variable

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.