PHPの解析/構文エラー。そしてそれらを解決する方法
誰もが構文エラーに遭遇します。経験豊富なプログラマーでさえタイプミスをします。新規参入者にとって、それは学習プロセスの一部にすぎません。ただし、多くの場合、次のようなエラーメッセージを解釈するのは簡単です。
PHP解析エラー:構文エラー、20行目のindex.phpに予期しない「{」
予期しないシンボルが必ずしも本当の原因であるとは限りません。しかし、行番号はどこから探し始めるかについての大まかな考えを与えます。
常にコードコンテキストを見てください。文法ミスがしばしば言及さに隠れたりして、前のコード行。コードをマニュアルの構文例と比較してください。
すべてのケースが他のケースと一致するわけではありませんが。しかし、構文の間違いを解決するための一般的な手順がいくつかあります。このリファレンスは、一般的な落とし穴をまとめたものです。
予期しないT_CONSTANT_ENCAPSED_STRING
予期しないT_ENCAPSED_AND_WHITESPACE予期しないT_IF
予期しないT_FOREACH
予期しないT_FOR
予期しないT_WHILE
予期しないT_DO
予期しないT_PRINT
予期しないT_ECHO予期しない
,
(コンマ)予期せぬ
.
(期間)予期しない
;
(セミコロン)予期しない
*
(アスタリスク)予期しない
:
(コロン)予期しない
&
(呼び出し時の参照渡し)
密接に関連する参照:
そして:
Stack Overflowは新人コーダーも歓迎していますが、主にプロのプログラミングの質問を対象としています。
- みんなのコーディングミスや狭いタイプミスに答えることは、ほとんどトピックから外れていると考えられています。
- したがって、構文修正リクエストを投稿する前に、時間をかけて基本的な手順に従ってください。
- それでも必要な場合は、独自の解決イニシアチブ、試行された修正、および何が間違っているかについての思考プロセスを示してください。
お使いの場合は、ブラウザ等「にSyntaxError:不正な文字」などのエラー・メッセージを表示し、それは実際にはありませんPHP関連のが、javascriptの-構文エラー。
ベンダーコードで発生した構文エラー:最後に、コードベースの編集によって構文エラーが発生しなかったが、外部ベンダーパッケージのインストールまたはアップグレード後に、PHPバージョンの非互換性が原因である可能性があることを考慮して、プラットフォームに対するベンダーの要件を確認してくださいセットアップ。
回答
構文エラーとは何ですか?
PHPは、に属しC-スタイルと命令的なプログラミング言語。厳格な文法規則があり、記号や識別子の置き忘れに遭遇したときに回復することはできません。コーディングの意図を推測することはできません。
最も重要なヒント
あなたが常に取ることができるいくつかの基本的な予防措置があります:
適切なコードインデントを使用するか、高尚なコーディングスタイルを採用します。読みやすさは不規則性を防ぎます。
構文を強調表示したPHP用のIDEまたはエディターを使用します。これは、括弧/ブラケットのバランス調整にも役立ちます。
マニュアルの言語リファレンスと例をお読みください。二度、やや上手になるために。
パーサーエラーを解釈する方法
典型的な構文エラーメッセージは次のとおりです。
解析エラー:構文エラー、予期しないT_STRING、期待「
;
」にfile.phpのライン 217
構文ミスの可能性のある場所をリストします。上記のファイル名と行番号を参照してください。
パーサー/トークンライザーが最終的に処理できなかったシンボルを説明するなどのモニカT_STRING
。ただし、これが必ずしも構文ミスの原因であるとは限りません。
以前のコード行も調べることが重要です。多くの場合、構文エラーは以前に発生した単なる事故です。エラー行番号は、パーサーがすべてを処理することを最終的に断念した場所です。
構文エラーの解決
構文の問題を絞り込んで修正するには、多くのアプローチがあります。
上記のソースファイルを開きます。上記のコード行を見てください。
暴走した文字列や置き忘れた演算子の場合、これは通常、原因を見つける場所です。
左から右の行を読んで、各記号が何をするか想像してください。
より定期的に、前の行も確認する必要があります。
特に、欠落している
;
セミコロンは前の行の終わり/ステートメントで欠落しています。(少なくともスタイルの観点から。)場合は
{
、コード・ブロックが}
間違って閉じまたはネストされている、あなたは、ソースコードまでも、さらに調査する必要があるかもしれません。それを単純化するために適切なコードインデントを使用してください。
構文の色付けを見てください!
文字列、変数、定数はすべて異なる色にする必要があります。
演算子
+-*/.
も明確に色付けする必要があります。そうでなければ、彼らは間違った文脈にあるかもしれません。文字列の色付けが長すぎたり短すぎたりする場合は、エスケープされていないか、閉じているマーカー
"
または'
文字列マーカーが欠落していることがわかります。同じ色の句読文字を2つ並べて配置すると、問題が発生する可能性もあります。そうでない場合は通常、事業者は孤独です
++
、--
オペレータ以下、または括弧。互いに直接続く2つの文字列/識別子は、ほとんどのコンテキストで正しくありません。
ホワイトスペースはあなたの友達です。任意のコーディングスタイルに従います。
長い行を一時的に分割します。
演算子または定数と文字列の間に改行を自由に追加できます。次に、パーサーは解析エラーの行番号を具体化します。非常に長いコードを調べる代わりに、欠落している構文記号や置き忘れた構文記号を分離できます。
複雑な
if
ステートメントを個別のif
条件またはネストされた条件に分割します。長い数式や論理チェーンの代わりに、一時変数を使用してコードを簡略化します。(読みやすく=エラーが少ない。)
次の間に改行を追加します。
- 正しいと簡単に識別できるコード、
- よくわからない部分は、
- そして、パーサーが不平を言う行。
ロングコードブロックを分割すると、実際に構文エラーの原因を突き止めるのに役立ちます。
コメントアウトコードを怒ら。
問題の原因を特定できない場合は、コードのブロックをコメントアウト(したがって一時的に削除)し始めます。
解析エラーを取り除くとすぐに、問題の原因が見つかりました。そこをもっとよく見てください。
完全な関数/メソッドブロックを一時的に削除したい場合があります。(一致しない中括弧と誤ってインデントされたコードの場合。)
構文の問題を解決できない場合は、コメントアウトされたセクションを最初から書き直してみてください。
新規参入者として、紛らわしい構文構造のいくつかを避けてください。
三項
? :
条件演算子はコードを圧縮でき、実際に役立ちます。ただし、すべての場合に読みやすさを向上させるわけではありません。if
精通していない間は平易な声明を好む。PHPの代替構文(
if:
/elseif:
/endif;
)はテンプレートでは一般的ですが、通常の{
コード}
ブロックよりも簡単に理解できません。
最も一般的な新規参入者の間違いは次のとおりです。
;
ステートメント/行を終了するためのセミコロンがありません。"
またはの文字列引用符が'
一致せず、その中の引用符がエスケープされていません。特に文字列の
.
連結の場合、演算子を忘れました。不均衡な
(
括弧)
。報告された行でそれらを数えます。同数ですか?
ある構文の問題を解決すると、次の問題が明らかになることを忘れないでください。
1つの問題を解決しても、以下のコードで他の問題が発生した場合は、ほとんど正しい方向に進んでいます。
新しい構文エラーを編集した後、同じ行にエラーが表示される場合は、変更を試みたが失敗した可能性があります。(常にではありません。)
修正できない場合は、以前に機能していたコードのバックアップを復元します。
- ソースコードのバージョン管理システムを採用します。
diff
壊れた最後の動作バージョンをいつでも表示できます。これは、構文の問題が何であるかについて啓発的かもしれません。
- ソースコードのバージョン管理システムを採用します。
目に見えない漂遊Unicode文字:場合によっては、ソースで16進エディターまたは別のエディター/ビューアーを使用する必要があります。コードを見ただけでは見つけられない問題もあります。
grep --color -P -n "\[\x80-\xFF\]" file.php
非ASCII記号を見つけるための最初の手段として試してください。特に、BOM、ゼロ幅スペース、または改行なしスペース、およびスマートクォートは、定期的にソースコードに組み込まれる可能性があります。
どのタイプの改行がファイルに保存されるかに注意してください。
PHPは\n改行を尊重するだけで、\rキャリッジリターンは尊重しません。
これは、MacOSユーザーにとって時々問題になります(誤って構成されたエディターのOS Xでも)。
多くの場合、単一行
//
または#
コメントが使用されている場合にのみ問題として表面化します。複数/*...*/
行コメントは、改行が無視されたときにパーサーを妨害することはめったにありません。
構文エラーがWeb経由で送信されない場合:マシンで構文エラーが発生している可能性があります。しかし、まったく同じファイルをオンラインで投稿しても、それはもう表示されません。これは、次の2つのいずれかを意味するだけです。
あなたは間違ったファイルを見ています!
または、コードに目に見えない漂遊Unicodeが含まれていました(上記を参照)。簡単に見つけることができます。コードをWebフォームからテキストエディタにコピーして戻すだけです。
PHPのバージョンを確認してください。すべての構文構造がすべてのサーバーで使用できるわけではありません。
php -v
コマンドラインインタプリタ用<?php phpinfo();
Webサーバーを介して呼び出されたもの。
それらは必ずしも同じではありません。特にフレームワークを使用する場合は、フレームワークを一致させる必要があります。PHPの予約済みキーワードを、関数/メソッド、クラス、または定数の識別子として使用しないでください。
試行錯誤が最後の手段です。
他のすべてが失敗した場合は、いつでもエラーメッセージをグーグルで検索できます。構文シンボルの検索はそれほど簡単ではありません(ただし、スタックオーバーフロー自体はSymbolHoundによってインデックス付けされます)。したがって、関連するものを見つける前に、さらに数ページを調べる必要がある場合があります。
その他のガイド:
- DavidSklarによるPHPデバッグの基本
- PHPのエラーを修正ジェイソンMcCrearyで
- PHPエラー– MarioLurigによる10のよくある間違い
- 一般的なPHPエラーと解決策
- WordPressWebサイトのトラブルシューティングと修正方法
- デザイナー向けのPHPエラーメッセージのガイド-SmashingMagazine
死の白い画面
Webサイトが空白の場合は、通常、構文エラーが原因です。次のコマンドで表示を有効にします。
error_reporting = E_ALL
display_errors = 1
あなたにはphp.ini
、一般的に、または経由.htaccess
mod_phpのため、あるいは.user.ini
FastCGIのセットアップと。
PHPは最初の行を解釈/実行することさえできないため、壊れたスクリプト内でそれを有効にするのは遅すぎます。簡単な回避策は、ラッパースクリプトを作成することtest.php
です。
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
次に、このラッパースクリプトにアクセスして、失敗したコードを呼び出します。
また、HTTP 500応答でスクリプトがクラッシュしたときに、PHPを有効にerror_log
して、Webサーバーerror.log
を調べるのにも役立ちます。
このトピックは完全に議論されすぎている/複雑すぎていると思います。IDEを使用することは、構文エラーを完全に回避するための方法です。IDEなしで作業することは、一種の専門家ではないとさえ言えます。どうして?最新のIDEは、入力するすべての文字の後に構文をチェックするためです。コードを記述して行全体が赤くなり、大きな警告通知が構文エラーの正確なタイプと正確な位置を示している場合、別の解決策を探す必要はまったくありません。
構文チェックIDEを使用するということは、次のことを意味します。
入力時に正しく表示されるという理由だけで、(事実上)構文エラーが発生することはありません。真剣に。
構文チェックを備えた優れたIDE(すべてLinux、Windows、Macで利用可能):
予期しない [
最近では、予期しない[
配列ブラケットが古い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構文→PHP5.4以降で可能
- PHP構文エラー、予期しない '['
- 配列の省略形:{}や[]のようなリテラル構文はありますか?
- PHP5.3.10とPHP5.5.3の構文エラーが予期しない '['
- array()と[]のPHPの違い
- PHP配列構文解析エラー左角括弧 "["
ところで、古いバージョンと遅いバージョンのPHPに本当に固執している場合は、プリプロセッサとPHP5.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を使用して、
]
配列の早期閉鎖を見つけます。少なくとも、より多くの間隔と改行を使用して絞り込みます。
予期しないT_VARIABLE
「予期しないT_VARIABLE
」とは$variable
、現在の式/ステートメント構造に適合しないリテラル名があることを意味します。
セミコロンがありません
最も一般的には、前の行にセミコロンがないことを示します。ステートメントに続く変数の割り当ては、どこを見ればよいかを示す良い指標です。
⇓ func1() $var = 1 + 2; # parse error in line +2
文字列の連結
よくある事故は、演算子を忘れた文字列の連結
.
です。⇓ print "Here comes the value: " $value;
ところで、読みやすさを向上させるときはいつでも、文字列補間(二重引用符で囲まれた基本変数)を優先する必要があります。これにより、これらの構文の問題が回避されます。
文字列補間は、スクリプト言語のコア機能です。それを利用することに恥はありません。変数の
.
連結が高速であるというマイクロ最適化のアドバイスは無視してください。そうではありません。式演算子がありません
もちろん、同じ問題が他の式、たとえば算術演算でも発生する可能性があります。
⇓ print 4 + 7 $var;
PHPは、変数を加算、減算、または比較する必要があるかどうかをここで推測することはできません。
リスト
配列の母集団のように、構文リストについても同じです。パーサーは、
,
たとえば次のように予想されるコンマも示します。⇓ $var = array("1" => $val, $val2, $val3 $val4);
または関数パラメータリスト:
⇓ function myfunc($param1, $param2 $param3, $param4)
同様に、
list
orglobal
ステートメントを使用した場合、またはループ内に;
セミコロンがない場合にこれが表示されfor
ますか。クラス宣言
このパーサーエラーは、クラス宣言でも発生します。静的定数のみを割り当てることができ、式は割り当てることができません。したがって、パーサーは、割り当てられたデータとしての変数について文句を言います。
class xyz { ⇓ var $value = $_GET["input"];
比類のない
}
閉じ中括弧は、特にここにつながる可能性があります。メソッドの終了が早すぎる場合(適切なインデントを使用してください!)、一般に、漂遊変数がクラス宣言本体に誤って配置されます。識別子の後の変数
⇓ $this->myFunc$VAR();
ところで、これはおそらく変数変数を使用することを意図した一般的な例です。この場合、
$this->{"myFunc$VAR"}();
たとえばを使用した可変プロパティルックアップ。変数変数の使用は例外であることに注意してください。アレイがより単純でより適切である場合でも、初心者はしばしばそれらをあまりにもカジュアルに使用しようとします。
言語構成の後に括弧がない
急いで入力する
if
とfor
、andおよびforeach
ステートメントの開き括弧または閉じ括弧を忘れてしまう可能性があります。⇓ foreach $array as $key) {
解決策:
(
ステートメントと変数の間に欠落している開口部を追加します。⇓ if ($var = pdo_query($sql) { $result = …
中
{
括弧は、最初に閉じ括弧でif
式を閉じない限り、コードブロックを開きません)
。それ以外の場合は条件を期待していません
⇓ else ($var >= 0)
解決策:から条件を削除する
else
か、を使用しますelseif
。閉鎖にはブラケットが必要
⇓ function() use $var {}
解決策:の周りに角かっこを追加します
$var
。見えない空白
「InvisiblestrayUnicode」(改行しないスペースなど)の参照回答で述べたように、次のような疑うことを知らないコードでもこのエラーが表示される場合があります。
<?php ⇐ $var = new PDO(...);
これは、ファイルの先頭やコピーアンドペーストされたコードでかなり一般的です。コードに構文の問題が含まれているように見えない場合は、16進エディタに確認してください。
も参照してください
予期しないT_CONSTANT_ENCAPSED_STRING
予期しないT_ENCAPSED_AND_WHITESPACE
扱いにくい名前T_CONSTANT_ENCAPSED_STRING
とT_ENCAPSED_AND_WHITESPACE
引用されたリテラルを参照してください。"string"
これらはさまざまなコンテキストで使用されますが、構文の問題は非常に似ています。T_ENCAPSED…警告は二重引用符で囲まれた文字列コンテキストで発生しますが、T_CONSTANT…文字列はプレーンなPHP式またはステートメントではしばしば誤っています。
不正な変数補間
そして、PHP変数の補間が正しくない場合に最も頻繁に発生します。
⇓ ⇓ echo "Here comes a $wrong['array'] access";
配列キーの引用は、PHPのコンテキストでは必須です。しかし、二重引用符で囲まれた文字列(またはヒアドキュメント)では、これは間違いです。パーサーは、含まれている一重引用符について文句を言い
'string'
ます。これは、通常、そこにリテラル識別子/キーが必要なためです。より正確には、配列参照の二重引用符内でPHP2スタイルの単純な構文を使用することが有効です。
echo "This is only $valid[here] ...";
ただし、ネストされた配列またはより深いオブジェクト参照には、複雑なカーリーストリング式の構文が必要です。
echo "Use {$array['as_usual']} with curly syntax.";
よくわからない場合は、これを使用する方が一般的に安全です。多くの場合、より読みやすいと見なされます。そして、より優れたIDEは、実際にはそのために異なる構文の色付けを使用します。
連結がありません
文字列が式の後に続くが、連結または他の演算子がない場合、PHPが文字列リテラルについて文句を言うのがわかります。
⇓ print "Hello " . WORLD " !";
あなたと私には明らかですが、PHPは、文字列がそこに追加されることを意図していたとは推測できません。
紛らわしい文字列引用符の囲い
文字列区切り文字を混同すると、同じ構文エラーが発生します。一
'
重"
引用符または二重引用符で始まる文字列も同じで終わります。⇓ print "<a href="' . $link . '">click here</a>"; ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟
その例は二重引用符で始まりました。しかし、二重引用符もHTML属性に向けられていました。ただし、内の意図された連結演算子は、一重引用符で囲まれた2番目の文字列の一部として解釈されるようになりました。
ヒント:一重引用符と二重引用符で囲まれた文字列にわずかに異なる色付けを使用するようにエディター/ IDEを設定します。(たとえば、テキスト出力には二重引用符で囲まれた文字列を、定数のような値にのみ一重引用符で囲まれた文字列を優先するアプリケーションロジックにも役立ちます。)
これは、そもそも二重引用符から抜け出してはならない良い例です。代わりに、HTML属性の引用符に適切な
\"
エスケープを使用してください。print "<a href=\"{$link}\">click here</a>";
これも構文の混乱につながる可能性がありますが、すべての優れたIDE /エディターは、エスケープされた引用符の色を変えることで再び役立ちます。
冒頭の引用がありません
同様に、パーサーエラーのレシピを開く
"
/'
引用するのを忘れています:⇓ make_url(login', 'open');
ここでは
', '
、明らかlogin
に文字列パラメータであることが意図されていた場合、はベアワードの後に文字列リテラルになります。配列リスト
,
配列作成ブロックでコンマを見逃した場合、パーサーには2つの連続した文字列が表示されます。array( ⇓ "key" => "value" "next" => "....", );
最後の行には常に余分なコンマが含まれている可能性がありますが、その間のコンマを見落とすことは許されないことに注意してください。これは、構文の強調表示なしでは見つけるのが困難です。
関数パラメータリスト
関数呼び出しについても同じことが言えます。
⇓ myfunc(123, "text", "and" "more")
暴走文字列
一般的なバリエーションは、非常に単純に忘れられた文字列ターミネータです。
⇓ mysql_evil("SELECT * FROM stuffs); print "'ok'"; ⇑
ここで、PHPは、2つの文字列リテラルが直接続くことについて文句を言います。しかし、本当の原因はもちろん、閉じられていない前の文字列です。
も参照してください
予期しないT_STRING
T_STRING
少し誤解です。引用されたを参照していません"string"
。これは、生の識別子が検出されたことを意味します。これは、bare
単語から残り物CONSTANT
や関数名、引用符で囲まれていない文字列、またはプレーンテキストまでさまざまです。
誤って引用された文字列
ただし、この構文エラーは、誤って引用された文字列値で最も一般的です。エスケープされていない迷子
"
または'
引用符は、無効な式を形成します。⇓ ⇓ echo "<a href="http://example.com">click here</a>";
構文の強調表示は、そのような間違いを非常に明白にします。文字列の囲いとして使用されたものに応じ
\"
て、二重引用符または\'
一重引用符をエスケープするために円記号を使用することを忘れないでください。- 便宜上、二重引用符を含むプレーンHTMLを出力する場合は、外側の一重引用符を使用することをお勧めします。
- 変数を補間する場合は二重引用符で囲まれた文字列を使用しますが、リテラルの
"
二重引用符がエスケープされることに注意してください。 - より長い出力を得るには、エスケープインおよびエスケープするのではなく、複数の
echo
/print
行を優先します。ヒアセクションを検討することをお勧めします。
別の例は、PHPで生成されたHTMLコード内でPHPエントリを使用することです。$text = '<div>some text with <?php echo 'some php entry' ?></div>'
これは、
$text
が大きく、行数が多く、開発者がPHP変数値全体を確認できず、ソースを忘れているコードの一部に焦点を合わせている場合に発生します。例はこちらPHPのシングルクォート文字列とダブルクォート文字列の違いは何ですか?も参照してください。。
閉じられていない文字列
クロージング
"
を見逃した場合、通常、構文エラーは後で発生します。終了していない文字列は、次の目的の文字列値まで、コードを少し消費することがよくあります。⇓ echo "Some text", $a_variable, "and some runaway string ; success("finished"); ⇯
T_STRING
パーサーが抗議するのは文字通りだけではありません。もう1つの頻繁なバリエーションは、Unexpected '>'
引用符で囲まれていないリテラルHTML用です。プログラミング以外の文字列引用符
ブログやウェブサイトからコードをコピーして貼り付けると、無効なコードになることがあります。活版印刷の引用は、PHPが期待するものではありません。
$text = ’Something something..’ + ”these ain't quotes”;
活版印刷/スマートクォートはUnicode記号です。PHPは、それらを隣接する英数字テキストの一部として扱います。たとえば
”these
、定数識別子として解釈されます。ただし、後続のテキストリテラルは、パーサーによってベアワード/ T_STRINGと見なされます。欠落しているセミコロン。再び
前の行に終了していない式がある場合、次のステートメントまたは言語構造は生の識別子として表示されます。
⇓ func1() function2();
PHPは、2つの関数を次々に実行するつもりなのか、それとも結果を乗算するのか、追加するのか、比較するのか、どちらか一方だけを実行するのかを判断できません
||
。<?xml
PHPスクリプトの短いオープンタグとヘッダーこれはかなり珍しいことです。ただし、short_open_tagsが有効になっている場合、PHPスクリプトをXML宣言で開始することはできません。
⇓ <?xml version="1.0"?>
PHPはを
<?
認識し、それ自体を再利用します。迷いxml
が何を意味するのか理解できません。定数として解釈されます。しかし、version
は別のリテラル/定数と見なされます。また、パーサーは、間に式演算子がないと、後続の2つのリテラル/値を理解できないため、パーサーの失敗になります。見えないUnicode文字
構文エラーの最も恐ろしい原因は、改行なしスペースなどのUnicode記号です。PHPでは、識別子名としてUnicode文字を使用できます。次のようなまったく疑わしくないコードに対してT_STRINGパーサーの苦情を受けた場合:
<?php print 123;
別のテキストエディタを作成する必要があります。または、16進エディタですら。ここではプレーンスペースと改行のように見えますが、目に見えない定数が含まれている場合があります。JavaベースのIDEは、UTF-8 BOMがマングルされていること、ゼロ幅スペース、段落区切り文字などに気付かない場合があります。すべてを再編集し、空白を削除して、通常のスペースを追加してください。
;
各行の先頭に冗長なステートメント区切り文字を追加して、それを絞り込むことができます。<?php ;print 123;
ここでの余分な
;
セミコロンは、先行する非表示の文字を未定義の定数参照(ステートメントとしての式)に変換します。その見返りに、PHPは有益な通知を生成します。変数名の前に `$`記号がありません
PHPの変数は、ドル記号とそれに続く変数名で表されます。
ドル記号(
$
)は、識別子を変数の名前としてマークする印章です。この印章がない場合、識別子は言語キーワードまたは定数である可能性があります。これは、PHPコードが別の言語(C、Java、JavaScriptなど)で記述されたコードから「翻訳」された場合の一般的なエラーです。このような場合、変数型の宣言(元のコードが型付き変数を使用する言語で記述されている場合)もこっそりとこのエラーを生成する可能性があります。
エスケープされた引用符
\
文字列で使用する場合、それは特別な意味を持ちます。これは「エスケープ文字」と呼ばれ、通常、パーサーに次の文字を文字通り受け取るように指示します。例:
echo 'Jim said \'Hello\'';
印刷しますJim said 'hello'
文字列の終了引用符をエスケープすると、終了引用符は文字通りに解釈され、意図したとおりにはなりません。つまり、文字列の一部として印刷可能な引用符として取得され、文字列を閉じません。これは通常、次の文字列を開いた後、またはスクリプトの最後に解析エラーとして表示されます。
Windowsでパスを指定する際の非常に一般的なエラー:
"C:\xampp\htdocs\"
が間違っています。必要"C:\\xampp\\htdocs\\"
です。型付きプロパティ
次のようなプロパティ入力を使用するには、PHP≥7.4が必要です。
public stdClass $obj;
予期しない (
開き括弧は通常、if
/ foreach
/ for
/ array
/などの言語構造に従うlist
か、算術式を開始します。それらは"strings"
、後、前()
、孤独$
、およびいくつかの典型的な宣言コンテキストでは構文的に正しくありません。
関数宣言パラメーター
このエラーのまれな発生は、デフォルトの関数パラメーターとして式を使用しようとすることです。これは、PHP7でもサポートされていません。
function header_fallback($value, $expires = time() + 90000) {
関数宣言のパラメーターは、リテラル値または定数式のみにすることができます。自由に使用できる関数呼び出しなどとは異なります
whatever(1+something()*2)
。クラスプロパティのデフォルト
クラスメンバー宣言についても同じことが言えます。ここでは、式ではなく、リテラル/定数値のみが許可されます。
class xyz { ⇓ var $default = get_config("xyz_default");
そのようなものをコンストラクターに入れてください。PHP属性で関数が許可されないのはなぜですか?も参照してください。
ここでも、PHP7では
var $xy = 1 + 2 +3;
定数式のみが許可されていることに注意してください。PHPのJavaScript構文
JavaScriptまたはjQuery構文の使用は、明らかな理由でPHPでは機能しません。
<?php ⇓ print $(document).text();
これが発生すると、通常、先行する文字列が終了していないことを示します。
<script>
PHPコードコンテキストにリークするリテラルセクション。isset(())、empty、key、next、current
isset()
とempty()
は両方とも言語に組み込まれており、関数ではありません。彼らは直接変数にアクセスする必要があります。ただし、誤って括弧のペアを追加しすぎると、式が作成されます。⇓ if (isset(($_GET["id"]))) {
同じことが、暗黙的な変数名アクセスを必要とするすべての言語構造に当てはまります。これらの組み込みは言語文法の一部であるため、装飾的な余分な括弧は使用できません。
変数参照を必要とするが、式の結果が渡されるユーザーレベルの関数は、代わりにランタイムエラーにつながります。
予期しない )
関数パラメーターがありません
関数呼び出しの最後に漂遊コンマを置くことはできません。PHPはそこに値を期待しているため、早期終了
)
括弧について不平を言います。⇓ callfunc(1, 2, );
末尾のコンマは、
array()
またはlist()
構成でのみ使用できます。未完成の表現
算術式で何かを忘れた場合、パーサーはあきらめます。それはおそらくそれをどのように解釈すべきであるか:
⇓ $var = 2 * (1 + );
また、締めくくりを忘れた場合は、
)
代わりに予期しないセミコロンについての苦情が寄せられます。Foreach as
constant
以下のために忘れて、可変
$
制御文の接頭辞あなたが表示されます。↓ ⇓ foreach ($array as wrong) {
ここでのPHPは、
::
代わりに期待していると言うことがあります。class :: $ variableが期待される$ variable式を満たしている可能性があるためです。
予期しない {
中括弧{
と}
コードブロックを囲みます。そして、それらに関する構文エラーは通常、いくつかの誤ったネストを示します。
の一致しない部分式
if
最も一般的にはアンバランスで
(
あり)
、パーサーがオープニングカーリーの{
出現が早すぎると不平を言う場合に発生します。簡単な例:⇓ if (($x == $y) && (2 == true) {
括弧を数えるか、それを支援するIDEを使用してください。また、スペースなしでコードを記述しないでください。読みやすさが重要です。
式のコンテキストでの{および}
式で中括弧を使用することはできません。括弧と中括弧を混同すると、言語の文法に準拠しなくなります。
⇓ $var = 5 * {7 + $x};
ローカルスコープ変数など、識別子の構築にはいくつかの例外があります
${references}
。変数変数またはカーリー変数式
これは非常にまれです。ただし、複雑な変数式に対する苦情を受け取っ
{
たり、}
パーサーしたりすることもあります。⇓ print "Hello {$world[2{]} !";
ただし
}
、そのような状況では予期しない可能性が高くなります。
予期しない }
「予期しない}
」エラーが発生した場合、ほとんどの場合、コードブロックを閉じるのが早すぎます。
コードブロックの最後のステートメント
これは、終了していない式で発生する可能性があります。
また、関数/コードブロックの最後の行に末尾の
;
セミコロンがない場合:function whatever() { doStuff() } ⇧
ここで、パーサーは
+ 25;
、関数の結果に追加したいのか、それとも他の何かを追加したいのかを判断できません。無効なブロックのネスト/忘れられた
{
コードブロックが
}
早すぎて閉じられた場合、または次の場合{
でも開始を忘れた場合に、このパーサーエラーが表示されることがあります。function doStuff() { if (true) ⇦ print "yes"; } } ⇧
上記のスニペットで
if
は、冒頭の{
中括弧がありませんでした。したがって、}
以下の最後のものは冗長になりました。したがって、}
機能を目的とした次のクロージングは、元のオープニング{
カーリーブレースに関連付けることができませんでした。このようなエラーは、適切なコードインデントなしでは見つけるのがさらに困難です。IDEとブラケットのマッチングを使用します。
予期しない{
、期待する(
条件/宣言ヘッダーとコードブロックを必要とする言語構造は、このエラーをトリガーします。
パラメータリスト
たとえば、パラメータリストのない誤って宣言された関数は許可されていません。
⇓ function whatever { }
制御ステートメントの条件
そして、あなたは同様に
if
条件なしを持つことはできません。⇓ if { }
明らかに、これは意味がありません。通常の容疑者、
for
/foreach
、while
/do
なども同じです。この特定のエラーが発生した場合は、必ずいくつかの手動の例を調べる必要があります。
予期しない$ 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は、一致する中括弧、角かっこ、括弧も強調表示します。これにより、それらの相関関係を非常に簡単に調べることができます。
終わりのない表現
また、Unexpected $end
構文/パーサーエラーは、終了していない式またはステートメントでも発生する可能性があります。
$var = func(1,
?>
EOF
したがって、最初にスクリプトの終わりを見てください。;
多くの場合、PHPスクリプトの最後のステートメントの末尾は冗長です。しかし、あなたはそれを持っているべきです。そのような構文の問題を絞り込むためです。
インデントされたヒアドキュメントマーカー
別の一般的な発生は、HEREDOCまたはNOWDOC文字列で発生します。終了マーカーは、先頭のスペースやタブなどでは無視されます。
print <<< END
Content...
Content....
END;
# ↑ terminator isn't exactly at the line start
したがって、パーサーはHEREDOC文字列がファイルの終わりまで続くと想定します(したがって、「予期しない$ end」)。ほとんどすべてのIDEと構文を強調するエディターは、これを明白にするか、警告します。
エスケープされた引用符
\
文字列で使用する場合、それは特別な意味を持ちます。これは「エスケープ文字」と呼ばれ、通常、パーサーに次の文字を文字通り受け取るように指示します。
例:echo 'Jim said \'Hello\'';
印刷しますJim said 'hello'
文字列の終了引用符をエスケープすると、終了引用符は文字通りに解釈され、意図したとおりにはなりません。つまり、文字列の一部として印刷可能な引用符として取得され、文字列を閉じません。これは通常、次の文字列を開いた後、またはスクリプトの最後に解析エラーとして表示されます。
Windowsでパスを指定する際の非常に一般的なエラー:"C:\xampp\htdocs\"
が間違っています。必要"C:\\xampp\\htdocs\\"
です。
代替構文
テンプレートのステートメント/コードブロックに代替構文を使用すると、この構文エラーが発生することはほとんどありません。たとえば、if:
andelse:
とmissingendif;
を使用します。
参照:
予期しないT_IF
予期しないT_ELSEIF
予期しないT_ELSE
予期しないT_ENDIF
条件付き制御ブロックif
、elseif
およびelse
単純な構造に従います。構文エラーが発生した場合は、ブロックのネストが無効である可能性があります→{
中括弧がないか、中括弧が}
多すぎます。
欠落している
{
か、}
インデントが正しくないため不一致のコード中括弧は、次のようなあまりフォーマットされていないコードに共通しています。
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) { … }
ダブル
}
}
はブランチを閉じるだけでなく、以前の条件構造を閉じます。したがって、1つのコーディングスタイルに固執します。ネストされたif / elseツリーを混在させないでください。ここでの一貫性は別として、長い条件を回避することも役立ちます。読み取り不可能な式を回避するには、一時変数または関数を使用してください
if
。IF
式では使用できません驚くほど頻繁な新参者の間違いは
if
、printステートメントなどのステートメントを式で使用しようとしていることです。⇓ echo "<a href='" . if ($link == "example.org") { echo …
もちろん、これは無効です。
三項条件を使用できますが、読みやすさの影響に注意してください。
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
それ以外の場合は、そのような出力構造を分割し
if
echo
ます。複数のsとsを使用します。
さらに良いことに、一時変数を使用し、次の前に条件を配置します。if ($link) { $href = "yes"; } else { $href = "no"; } echo "<a href='$href'>Link</a>";
このような場合に関数やメソッドを定義することも、多くの場合意味があります。
制御ブロックは「結果」を返しません
現在、これはあまり一般的ではありませんが
if
、結果を返すことができるかのように処理しようとするコーダーもいます。$var = if ($x == $y) { "true" };
これは
if
、文字列の連結/式内で使用するのと構造的に同じです。- ただし、制御構造(if / foreach / while)には「結果」がありません。
- リテラル文字列「true」も無効なステートメントになります。
コードブロックで割り当てを使用する必要があります:
if ($x == $y) { $var = "true"; }
または、
?:
3元比較を使用します。もしそうなら
⇓ if ($x == true and (if $y != false)) { ... }
and
(またはor
)はすでに連鎖比較を許可しているため、これは明らかに冗長です。忘れられた
;
セミコロンもう一度:各制御ブロックはステートメントである必要があります。前のコード部分がセミコロンで終了していない場合、それは保証された構文エラーです。
⇓ $var = 1 + 2 + 3 if (true) { … }
ところで、
{…}
コードブロックの最後の行にもセミコロンが必要です。セミコロンが早すぎる
この落とし穴は見落としがちなので、特定のコーディングスタイルを非難するのはおそらく間違っています。
⇓ if ($x == 5); { $y = 7; } else ← { $x = -1; }
これはあなたが想像するよりも頻繁に起こります。
- とき、あなたは終了
if ()
と表現し;
、それが空のステートメントを実行します。;
空になった{}
、独自の! {…}
したがって、ブロックはから切り離され、if
常に実行されます。- その
else
ため、はオープンif
構造との関係がなくなりました。これが、予期しないT_ELSE構文エラーにつながる理由です。
これは、この構文エラーの同様に微妙なバリエーションも説明しています。
if ($x) { x_is_true(); }; else { something_else(); };
どこ
;
のコードの後にブロックが{…}
全体終了if
切断、構造をelse
構文的にブランチを。- とき、あなたは終了
コードブロックを使用しない
構文的に中括弧を省略することが許可されています
{
...}
のコードブロックのためにif
/elseif
/else
支店。悲しいことに、これは知識のないコーダーに非常に一般的な構文スタイルです。(誤った仮定の下では、これは入力または読み取りが迅速でした)。ただし、構文がつまずく可能性が高くなります。遅かれ早かれ、追加のステートメントがif / elseブランチに入るでしょう。
if (true) $x = 5; elseif (false) $x = 6; $y = 7; ← else $z = 0;
しかし、実際にコードブロックを使用するには、持っている書き込みに
{
...}
など、それらを!経験豊富なプログラマーでさえ、このブレースレス構文を回避するか、少なくともルールの例外的な例外として理解しています。
Else / Elseifの順序が間違っている
もちろん、覚えておくべきことの1つは、条件付きの順序です。
if ($a) { … } else { … } elseif ($b) { … } ↑
はいくつでも持つことができ
elseif
ますが、else
最後に行かなければなりません。それがまさにその通りです。クラス宣言
上記の、あなたはクラス宣言で制御ステートメントを持つことはできません。
class xyz { if (true) { function ($var) {} }
予期しないT_ELSEIF / T_ELSE
PHPとHTMLを混在させる場合、の終了は次のと同じPHPブロック内に
}
ある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 } ?>
これは多かれ少なかれ誤ったインデントのバリエーションです-おそらく間違ったコーディング意図に基づいています。
あなたはできません他の文マッシュ挟んif
およびelseif
/else
構造的なトークンを:if (true) { } echo "in between"; ← elseif (false) { } ?> text <?php ← else { }
どちらも
{…}
コードブロックでのみ発生し、制御構造トークン間では発生しません。- とにかくこれは意味がありません。PHPが
if
とelse
ブランチの間をジャンプするときに、「未定義」の状態があったわけではありません。 - 印刷ステートメントがどこに属するか、または両方のブランチで繰り返す必要があるかどうかを判断する必要があります。
また、異なる制御構造間でif / elseを分割することもできません。
foreach ($array as $i) { if ($i) { … } } else { … }
何もありません統語的関係の間
if
とはelse
。foreach
レキシカルスコープの端は}
、そのためにはポイントがないif
構造が継続します。- とにかくこれは意味がありません。PHPが
T_ENDIF
予期せぬT_ENDIFが文句を言っている場合は、別の構文を使用しているスタイル
if:
⋯elseif:
⋯else:
⋯をendif;
。あなたは本当に二度考えるべきです。よくある落とし穴は、不気味に似た
:
コロンを;
セミコロンと混同することです。(「セミコロンが早すぎる」で取り上げられています)テンプレートファイルでインデントを追跡するのは難しいため、代替構文を使用する場合は多くなります。
endif;
いずれにも一致しない可能性がありますif:
。使用
} endif;
は二重if
ターミネーターです。
「予期しない$ end」は通常、忘れられたクロージング
}
カーリーブレースの価格です。割り当てと比較
したがって、これは構文エラーではありませんが、このコンテキストで言及する価値があります。
⇓ if ($x = true) { } else { do_false(); }
これは
==
/===
比較ではなく、=
割り当てです。これはかなり微妙であり、一部のユーザーは条件ブロック全体を無力に編集することになります。最初に意図しない割り当てに注意してください-論理的な障害/誤動作が発生したときはいつでも。
予期しない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
表現。パーサーがそれらについて不平を言う場合、それはしばしば(
)
それらの周りの誤ったペアリングまたは不一致のパレンを意味します。
親のグループ化
特に、
if
多重比較のあるステートメントの場合、開始括弧と終了括弧を正しくカウントするように注意する必要があります。⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑
ここで、ここでの
if
条件はすでに)
比較が十分に複雑になると、それを複数のネストされた
if
構造に分割するのに役立つことがよくあります。isset()を比較してマッシュポテト
一般的な新参者は、pitfalが組み合わせ
isset()
たりempty()
比較したりしようとしていることです。⇓ if (empty($_POST["var"] == 1)) {
あるいは:
⇓ if (isset($variable !== "value")) {
isset
とempty
は変数名のみを受け入れる言語構造であるため、これはPHPには意味がありません。出力はブール値のみ/すでにブール値であるため、結果を比較することも意味がありません。配列演算子
>=
と大なりまたは等しいを混同する=>
どちらの演算子も多少似ているため、混同されることがあります。
⇓ if ($var => 5) { ... }
あなただけのこの比較演算子は「と呼ばれていることを覚えておく必要がより大きいか等しいを右にそれを得るために」。
比較するものはありません
また、同じ変数名に関連する2つの比較を組み合わせることはできません。
⇓ if ($xyz > 5 and < 100)
PHPは、初期変数を再度比較するつもりだったと推測することはできません。式は通常、演算子の優先順位に従ってペアになっているため
<
、が表示されるまでに、元の変数からのブール結果のみが残ります。比較チェーン
演算子の行を持つ変数と比較することはできません。
⇓ $reult = (5 < $x < 10);
これは、それぞれに対しての2つの比較に分割する必要があります
$x
。これは実際には、ブラックリストに登録された式の場合です(同等の演算子の結合性のため)。いくつかのCスタイル言語では構文的に有効ですが、PHPはそれを期待される比較チェーンとしても解釈しません。
予期し
>
ない予期しない<
大なり記号
>
または小なり記号に<
は、カスタムT_XXX
トークナイザー名がありません。そして、それらは他のすべてのように置き忘れられる可能性がありますが、パーサーが誤って引用された文字列やマッシュされたHTMLについて不平を言うのをよく目にします。⇓ print "<a href='z">Hello</a>"; ↑
これは、文字列
"<a href='z"
が>
リテラル定数Hello
と比較されてから、別の<
比較が行われることを意味します。または、少なくともPHPがそれを認識する方法です。実際の原因と構文の間違いは、文字列の早期"
終了でした。PHPの開始タグをネストすることもできません。
<?php echo <?php my_func(); ?> ↑
参照:
予期しないT_IF
予期しないT_FOREACH
予期しないT_FOR
予期しないT_WHILE
予期しないT_DO
予期しないT_ECHO
コントロールのような構築物if
、foreach
、for
、while
、list
、global
、return
、do
、print
、echo
唯一のステートメントとして使用することができます。彼らは通常、彼ら自身で一列に並んでいます。
セミコロン; どこにいるの?
パーサーが制御ステートメントについて不平を言った場合、かなり普遍的に前の行のセミコロンを見逃しましたか?
⇓ $x = myfunc() if (true) {
解決策:前の行を調べてください。セミコロンを追加します。
クラス宣言
これが発生する別の場所は、クラス宣言です。クラスセクションでは、プロパティの初期化とメソッドセクションのみを一覧表示できます。そこにコードを置くことはできません。
class xyz { if (true) {} foreach ($var) {}
このような構文エラーは、一般的に間違ってネストされたためにマテリアライズ
{
と}
。特に、関数コードブロックが早く閉じられた場合。式のコンテキストでのステートメント
ほとんどの言語構造は、ステートメントとしてのみ使用できます。それらは他の表現の中に置かれることを意図されていません:
⇓ $var = array(1, 2, foreach($else as $_), 5, 6);
同様に
if
、文字列、数式、またはその他の場所でを使用することはできません。⇓ print "Oh, " . if (true) { "you!" } . " won't work"; // Use a ternary condition here instead, when versed enough.
if
特に式に似たような条件を埋め込むには、?:
3項評価を使用することがよくあります。同様に当てはまり
for
、while
、global
、echo
およびより少ない延びますlist
。⇓ echo 123, echo 567, "huh?";
一方
print()
、式のコンテキストで使用できる組み込みの言語です。(しかし、ほとんど意味がありません。)識別子として予約されたキーワード
また、ユーザー定義関数またはクラス名に
do
またはif
およびその他の言語構造を使用することはできません。(おそらくPHP 7で。しかし、それでもお勧めできません。)コントロールブロックの後に、コロン(:)または中括弧({)の代わりにセミコロンがあります
制御構造は通常、スコープを表すために中括弧で囲まれています(ただし、コロンは別の構文で使用できます)。誤ってセミコロンを使用した場合、そのブロックを途中で閉じてしまい、終了ステートメントでエラーがスローされます。
foreach ($errors as $error); <-- should be : or {
予期しない '?'
??
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();
)を示しています。
予期しないT_LNUMBER
トークンT_LNUMBER
は「長い」/数字を参照します。
無効な変数名
PHPや他のほとんどのプログラミング言語では、変数を数字で始めることはできません。最初の文字はアルファベットまたはアンダースコアである必要があります。
$1 // Bad $_1 // Good
PHPのコンテキストで-placeholdersを使用すると、かなり頻繁に出てきます。
preg_replace
"$1"
# ↓ ⇓ ↓ preg_replace("/#(\w+)/e", strtopupper($1) )
コールバックが引用されるべきだった場所。(現在、
/e
正規表現フラグは非推奨になっています。ただし、preg_replace_callback
関数で誤用されることがあります。)同じ識別子の制約がオブジェクトのプロパティに適用されます。
↓ $json->0->value
トークナイザー/パーサーは
$1
変数名としてリテラルを許可しませんが、またはを使用できます。これは、非標準の識別子の構文上の回避策です。(これはローカルスコープルックアップと考えるのが最善です。ただし、一般的には、このような場合はプレーン配列をお勧めします!)${1}
${"1"}
面白いですが、あまりお勧めできませんが、PHPパーサーはUnicode識別子を許可します。そのようなもの
$➊
は有効です。(リテラルとは異なります1
)。
漂遊配列エントリ
配列宣言でも予期しないlongが発生する可能性があります-
,
コンマがない場合:# ↓ ↓ $xy = array(1 2 3);
または、同様に、関数呼び出しと宣言、およびその他の構成要素:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
したがって、通常、リストまたは式を区切るための1つ
;
または,
欠落があります。誤って引用されたHTML
繰り返しになりますが、誤って引用された文字列は、しばしば迷子の原因になります。
# ↓ ↓ echo "<td colspan="3">something bad</td>";
このような場合は、多かれ少なかれ予期しないT_STRINGエラーのように扱う必要があります。
その他の識別子
関数、クラス、名前空間のいずれにも、次のいずれかの番号で始まる名前を付けることはできません。
↓ function 123shop() {
変数名の場合とほとんど同じです。
予期しない '='
これは、変数名に無効な文字が含まれていることが原因である可能性があります。変数名は次のルールに従う必要があります。
変数名は、PHPの他のラベルと同じルールに従います。有効な変数名は、文字またはアンダースコアで始まり、その後に任意の数の文字、数字、またはアンダースコアが続きます。正規表現としては、次のように表されます。 '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'
予期しない '続行'(T_CONTINUE)
continue
はステートメント(for、ifなど)であり、スタンドアロンで表示する必要があります。式の一部として使用することはできません。部分的にはcontinueが値を返さないためですが、式ではすべての部分式が何らかの値になる必要があるため、式全体が値になります。それがステートメントと式の違いです。
つまりcontinue
、3項ステートメントまたは戻り値を必要とするステートメントでは使用できません。
予期しない「ブレーク」(T_BREAK)
break;
もちろん同じことが言えます。また、式のコンテキストでは使用できませんが、厳密なステートメント(foreach
またはif
ブロックと同じレベル)で使用できます。
予期しない 'リターン'(T_RETURN)
さて、これはにとってもっと驚くべきことかもしれませんがreturn
、それは単なるブロックレベルのステートメントでもあります。上位のスコープ/関数に値(またはNULL)を返しますが、式自体としては評価されません。→つまり、やる意味がないreturn(return(false);;
予期しない '。'
これは、サポートされていないバージョンのPHPでsplat operator(...
)を使用しようとしている場合に発生する可能性があります。
...
関数への可変数の引数をキャプチャするために、PHP5.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'];
予期しない 'endwhile'(T_ENDWHILE)
構文はコロンを使用しています-コロンがない場合、上記のエラーが発生します。
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
この構文の代わりに、中括弧を使用することもできます。
<?php while($query->fetch()) { ?>
....
<?php } ?>
開始するエラーメッセージはParse error: syntax error, unexpected ':'
、クラスの静的参照Class::$Variable
を誤ってとして記述したことが原因である可能性がありますClass:$Variable
。