誰もが構文エラーに遭遇する。経験豊富なプログラマーでさえタイプミスをする。新人にとって、それは学習プロセスの一部です。しかし、次のようなエラーメッセージを解釈するのは簡単です: PHP Parse error: syntax error, unexpected '{' in index.php on line 20. 予期しないシンボルが本当の原因とは限りません。しかし、行番号から、どこから探し始めるべきかの大まかな見当がつきます。 常にコードコンテキストを見てください。構文の間違いは、多くの場合、言及されたまたは前のコード行に隠れています。マニュアルの構文例と自分のコードを比較してください。 すべてのケースが一致するわけではありません。しかし、シンタックスミスを解決するための一般的なステップがいくつかあります。 このリファレンスには、よくある落とし穴がまとめられています:
{
}
(
)
](https://stackoverflow.com/a/18092308)[
]
](https://stackoverflow.com/a/29505827)}
が正しく閉じられていなかったり入れ子になっていたりする場合は、 ソースコードのさらに上まで調査する必要があるかもしれません。それを単純化するために、適切な コード・インデント を使用してください。+-*/.
も異なる色にする。そうでないと、間違った文脈になってしまうかもしれません。"
や '
が欠けています。++
、--
、括弧がなければ、演算子は単独で存在する。2つの文字列や識別子が直接隣り合っているのは、ほとんどの文脈で正しくありません。if
ステートメントを個別の if
条件や入れ子の if
条件に分割する。?しかし、すべての場合において可読性を向上させるものではありません。未熟なうちは、プレーンな
if` 文を使うことをお勧めします。if:
/elseif:
/endif;
)はテンプレートでは一般的ですが、通常の {
code }
ブロックよりも間違いなく簡単ではありません。;
が見つからない。
-"や
'`の文字列引用符の不一致や、引用符のエスケープされていない文字列。.
の連結。(
括弧 )
.報告された行の括弧を数えてください。その数は同じですか?差分
をいつでも見ることができる。構文の問題が何なのかを知るためのヒントになるかもしれません。
<br/>;grep --color -P -n "¦[¦x80-¦]" file.php
を試してみてください。//
や #
コメントを使用した場合にのみ発生します。複数行の /*...*/
コメントは改行が無視されるため、パーサーを混乱させることはめったにありません。php -v
を使用します。ウェブサイトが真っ白な場合、通常は構文エラーが原因です。 エラー表示を有効にしてください:
です。 一般的には[
php.ini][18]、mod_phpの場合は[
.htaccess][19]を使ってください、 あるいは、[
.user.ini][20] で FastCGI を設定することもできます。 PHPは最初の行を解釈/実行することさえできないので、壊れたスクリプトの中で有効にするのは遅すぎます。手っ取り早い回避策は、
test.php`のようなラッパースクリプトを作成することです:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
そして、このラッパースクリプトにアクセスして、失敗したコードを呼び出します。
また、PHPのerror_log
を有効にして、HTTP 500レスポンスでスクリプトがクラッシュしたときに、webserver's error.log
を調べることも有効です。
このトピックは完全に議論されすぎている/複雑すぎると思います。 IDEを使用することは、構文エラーを完全に回避するための方法です。 IDEなしで作業することは、専門家ではないとも言えます。 なぜ? 最新のIDEは、入力するすべての文字の後に構文をチェックするためです。 コーディングすると、行全体が赤に変わり、大きな警告通知で構文エラーの正確なタイプと正確な位置が表示される場合は、別のソリューションを検索する必要はまったくありません。
入力時に正しく表示されるからといって、(効果的に)構文エラーに二度と遭遇することはありません。 真剣に。。
構文チェック付きの優れたIDE(それらはすべてLinux、Windows、Macで使用できます):。
1。 NetBeans[無料]。 2。 PHPStorm[$ 199 USD]。 3。 EclipsePHPプラグイン[無料]。 4。 Sublime$ 80 USD。
[
。最近では、予期しない [
配列ブラケットが古い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を使用してブラケットマッチングを行い、時期 ⁇ 早の `] `配列クロージャーを見つけます。 少なくとも、スペースと改行を増やして絞り込みます。
予期しないT_VARIABLE
"は、現在の式やステートメントの構造に合わない $variable
というリテラル名があることを意味します。
。
⇓
func1()
var = 1 + 2; # +2行目のパースエラー
.
演算子を忘れた文字列連結です:
⇓
print "ここに値が入ります: " $value;
文字列の補間](http://php.net/types.string#language.types.string.parsing) (基本変数を二重引用符で囲む) の方が読みやすくなります。そうすれば、このような構文の問題を避けることができます。
文字列補間はスクリプト言語のコア機能です。それを利用することは恥ではない。変数 .
の連結の方が速いというようなマイクロ最適化のアドバイスは無視してください。**そうではありません。
⇓
print 4 + 7 $var;
PHPは、変数が加算されるべきなのか、減算されるべきなのか、比較されるべきなのかを推測することはできません。
,
も示します:
⇓
var = array("1" => $val, $val2, $val3 $val4);
あるいは関数のパラメータ・リスト:
⇓
関数 myfunc($param1, $param2 $param3, $param4)
同様に、list
文やglobal
文、あるいはfor
ループの中で;
セミコロンが欠けている場合にも、このようなことが起こる。
class xyz { ⇓ 変数が代入されたデータであるとパーサーは文句を言います。
var $value = $_GET["input"];
マッチしない}
閉じ中括弧は、特にここにつながる可能性があります。メソッドの終了が早すぎる場合 (適切なインデントを使用しましょう!)、迷子の変数がクラス宣言本体に誤って配置されることがよくあります。
⇓
this->myFunc$VAR();
これはよくある例で、変数変数を使うつもりだったのかもしれません。この場合、例えば$this->{"myFunc$VAR"}();
で変数のプロパティを検索します。
変数変数の使用は例外であるべきだということを心に留めておいてください。初心者はしばしば、配列の方がシンプルで適切であるにもかかわらず、あまりにも気軽に使おうとします。
や
for、
foreach`文のための括弧を忘れてしまうことがある:
⇓
foreach $array as $key) { $keyとして$arrayを返す。
解決策:ステートメントと変数の間に欠落している開口部 (
)' を追加する。
⇓
else ($var >= 0)
解決策elseから条件を取り除くか、[
elseif`](http://php.net/manual/en/control-structures.elseif.php)を使う。
⇓
function() は $var {} を使用します。
解決策var`の周りに括弧を追加する。
php
⇐
$var = new PDO(...);
これは、ファイルの先頭やコピー&ペーストされたコードによく見られます。あなたのコードが視覚的に構文の問題を含んでいないように見える場合は、ヘクスエディターでチェックしてください。
<。!--ToDo:https://stackoverflow.com/a/13935532/345031を組み込みます。-->。
扱いにくい名前 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つの文字列リテラルを互いに直接不平を言っています。 しかし、本当の原因はもちろん、閉じられていない以前の文字列です。
こちらもご覧ください。
T_STRINGは少し誤用です。引用符で囲まれた
"string"を指すのではない。これは生の識別子に遭遇したことを意味する。これは、
bareな単語から、
CONSTANT`や関数名の残り、忘れられた引用符で囲まれていない文字列、またはプレーンテキストに及ぶ可能性がある。
<?xml
PHPスクリプトのヘッダー(
。括 ⁇ を開くことは通常、「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 /
foreach、
while/
do`などです。
この特定のエラーが発生した場合は、いくつかの手動の例を確実に調べる必要があります。
予期しないT_IF
。
予期しないT_ELSEIF
。
予期しないT_ELSE
。
予期しないT_ENDIF。
< / h2>。
条件付きコントロールブロック「if」、「elseif」、「else」は単純な構造に従います。 構文エラーが発生した場合は、おそらく無効なブロックネスト→ {
curly braces }
が欠落しているか、または1つ多すぎます。
。。
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ブロック「<」にある必要があります?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)です。 これはかなり微妙で、一部のユーザーが簡単に条件ブロック全体を編集できるようになります。 最初に意図しない割り当てに注意してください-論理障害/不正行為が発生したときはいつでも。
PHPが「予期しない $ end
」について話すとき、それはあなたのコードが時期 ⁇ 早に終わったことを意味します。 (メッセージは文字通りとられると少し誤解を招くものです。 新規参入者が想定するように、「$ end」という名前の変数についてではありません。 「ファイルの終わり」、 EOF< / kbd>を指します。)。
原因:コードブロック/および関数またはクラス宣言の不均衡な「{」および「}」。
これは、先行するコードブロックを閉じるための欠落している }
カーリーブレースについて、常に**かなりです。
*繰り返しになりますが、そのような問題を回避するには、適切なインデントを使用してください。
*ブラケットが一致するIDEを使用して、「}」がどこに間違っているかを確認します。 ほとんどのIDEとテキストエディターにはキーボードショートカットがあります。
-NetBeans、PhpStorm、Komodo:<kbd> Ctrl< / kbd><kbd> [< / kbd>および<kbd> Ctrl< / kbd><kbd>]< / kbd>
-Eclipse、Aptana:<kbd> Ctrl< / kbd><kbd> Shift< / kbd><kbd> P< / kbd>。
-Atom、Sublime:<kbd> Ctrl< / kbd><kbd> m< / kbd> -Zend Studio<kbd> Ctrl< / kbd><kbd> M< / kbd>
-Geany、Notepad ++:<kbd> Ctrl< / kbd><kbd> B< / kbd> -ジョー:<kbd> / kbd><kbd>
ほとんどのIDEは、ブレース、ブラケット、括 ⁇ に一致するハイライトも備えています。 これにより、相関関係を簡単に検査できます。
また、「予期しない$ end」構文/パーサーエラーは、終了していない式やステートメントでも発生する可能性があります。
$ var = func(1、
。
?>
EOF< / kbd>。まず、スクリプトの最後を見てください。 末尾の ;
は、多くの場合、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:
と else:
と欠落している endif;
を使用します。
「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){"あなた。!" }。 . "動かない" ;。
//十分に精通している場合は、代わりにここで三元条件を使用します。
<sup>特に式に `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で。 しかし、それでもそれはお勧めできません。)。
& 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)に従ってペアになるため、「<」が表示されるまでに、元の変数から残っているブール値の結果。
参照:[予期しないT_IS_SMALLER_OR_EQUAL](https://stackoverflow.com/questions/10148054/how-to-check-if-a-text-box-is-not-empty-and-the-value-is -500未満)。
5。 < h3>比較チェーン< / 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/。
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();
)をバインドしました)。
トークン「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(){。
変数名とほとんど同じです。
continue
はステートメント(for、ifなど)であり、スタンドアロンで表示する必要があります。 表現の一部として使用することはできません。 continueが値を返さないという理由もありますが、式ではすべてのサブ式がある程度の値になる必要があるため、式全体が値になります。 それがステートメントと表現の違いです。
つまり、「継続」は、3項ステートメントまたは戻り値を必要とするステートメントでは使用できません。
もちろん「休憩」についても同様です。 また、式のコンテキストでは使用できませんが、厳密なステートメント(「foreach」または「if」ブロックと同じレベル)です。
これは「戻る」のほうが意外かもしれませんが、それは単なるブロックレベルのステートメントでもあります。 値(またはNULL)をより高いスコープ/関数に返しますが、式自体としては評価しません。 →つまり、「return(return(false);;」を実行しても意味がありません。
構文はコロンを使用しています-コロンがない場合、上記のエラーが発生します。
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
この構文の代替は、巻き毛ブラケットを使用することです。
<?php while($query->fetch()) { ?>
....
<?php } ?>