20 に答える
What are the syntax errors?
PHP belongs to the C-style and imperative programming languages. It has rigid grammar rules, which it cannot recover from when encountering misplaced symbols or identifiers. It can't guess your coding intentions.
Most important tips
There are a few basic precautions you can always take:
Use proper code indentation, or adopt any lofty coding style. Readability prevents irregularities.
Use an IDE or editor for PHP with syntax highlighting. Which also help with parentheses/bracket balancing.
Read the language reference and examples in the manual. Twice, to become somewhat proficient.
How to interpret parser errors
A typical syntax error message reads:
Parse error: syntax error, unexpected T_STRING, expecting '
;
' in file.php on line 217
Which lists the possible location of a syntax mistake. See the mentioned file name and line number.
A moniker such as T_STRING
explains which symbol the parser/tokenizer couldn't process finally. This isn't necessarily the cause of the syntax mistake, however.
It's important to look into previous code lines as well. Often syntax errors are just mishaps that happened earlier. The error line number is just where the parser conclusively gave up to process it all.
Solving syntax errors
There are many approaches to narrow down and fix syntax hiccups.
Open the mentioned source file. Look at the mentioned code line.
For runaway strings and misplaced operators, this is usually where you find the culprit.
Read the line left to right and imagine what each symbol does.
More regularly you need to look at preceding lines as well.
In particular, missing
;
semicolons are missing at the previous line ends/statement. (At least from the stylistic viewpoint. )If
{
code blocks}
are incorrectly closed or nested, you may need to investigate even further up the source code. Use proper code indentation to simplify that.
Look at the syntax colorization!
Strings and variables and constants should all have different colors.
Operators
+-*/.
should be tinted distinct as well. Else they might be in the wrong context.If you see string colorization extend too far or too short, then you have found an unescaped or missing closing
"
or'
string marker.Having two same-colored punctuation characters next to each other can also mean trouble. Usually, operators are lone if it's not
++
,--
, or parentheses following an operator. Two strings/identifiers directly following each other are incorrect in most contexts.
Whitespace is your friend. Follow any coding style.
Break up long lines temporarily.
You can freely add newlines between operators or constants and strings. The parser will then concretize the line number for parsing errors. Instead of looking at the very lengthy code, you can isolate the missing or misplaced syntax symbol.
Split up complex
if
statements into distinct or nestedif
conditions.Instead of lengthy math formulas or logic chains, use temporary variables to simplify the code. (More readable = fewer errors.)
Add newlines between:
- The code you can easily identify as correct,
- The parts you're unsure about,
- And the lines which the parser complains about.
Partitioning up long code blocks really helps to locate the origin of syntax errors.
Comment out offending code.
If you can't isolate the problem source, start to comment out (and thus temporarily remove) blocks of code.
As soon as you got rid of the parsing error, you have found the problem source. Look more closely there.
Sometimes you want to temporarily remove complete function/method blocks. (In case of unmatched curly braces and wrongly indented code.)
When you can't resolve the syntax issue, try to rewrite the commented out sections from scratch.
As a newcomer, avoid some of the confusing syntax constructs.
The ternary
? :
condition operator can compact code and is useful indeed. But it doesn't aid readability in all cases. Prefer plainif
statements while unversed.PHP's alternative syntax (
if:
/elseif:
/endif;
) is common for templates, but arguably less easy to follow than normal{
code}
blocks.
The most prevalent newcomer mistakes are:
Missing semicolons
;
for terminating statements/lines.Mismatched string quotes for
"
or'
and unescaped quotes within.Forgotten operators, in particular for the string
.
concatenation.Unbalanced
(
parentheses)
. Count them in the reported line. Are there an equal number of them?
Don't forget that solving one syntax problem can uncover the next.
If you make one issue go away, but other crops up in some code below, you're mostly on the right path.
If after editing a new syntax error crops up in the same line, then your attempted change was possibly a failure. (Not always though.)
Restore a backup of previously working code, if you can't fix it.
- Adopt a source code versioning system. You can always view a
diff
of the broken and last working version. Which might be enlightening as to what the syntax problem is.
- Adopt a source code versioning system. You can always view a
Invisible stray Unicode characters: In some cases, you need to use a hexeditor or different editor/viewer on your source. Some problems cannot be found just from looking at your code.
Try
grep --color -P -n "\[\x80-\xFF\]" file.php
as the first measure to find non-ASCII symbols.In particular BOMs, zero-width spaces, or non-breaking spaces, and smart quotes regularly can find their way into the source code.
Take care of which type of linebreaks are saved in files.
PHP just honors \n newlines, not \r carriage returns.
Which is occasionally an issue for MacOS users (even on OS X for misconfigured editors).
It often only surfaces as an issue when single-line
//
or#
comments are used. Multiline/*...*/
comments do seldom disturb the parser when linebreaks get ignored.
If your syntax error does not transmit over the web: It happens that you have a syntax error on your machine. But posting the very same file online does not exhibit it anymore. Which can only mean one of two things:
You are looking at the wrong file!
Or your code contained invisible stray Unicode (see above). You can easily find out: Just copy your code back from the web form into your text editor.
Check your PHP version. Not all syntax constructs are available on every server.
php -v
for the command line interpreter<?php phpinfo();
for the one invoked through the webserver.
Those aren't necessarily the same. In particular when working with frameworks, you will them to match up.Don't use PHP's reserved keywords as identifiers for functions/methods, classes or constants.
Trial-and-error is your last resort.
If all else fails, you can always google your error message. Syntax symbols aren't as easy to search for (Stack Overflow itself is indexed by SymbolHound though). Therefore it may take looking through a few more pages before you find something relevant.
Further guides:
- PHP Debugging Basics by David Sklar
- Fixing PHP Errors by Jason McCreary
- PHP Errors – 10 Common Mistakes by Mario Lurig
- Common PHP Errors and Solutions
- How to Troubleshoot and Fix your WordPress Website
- A Guide To PHP Error Messages For Designers - Smashing Magazine
White screen of death
If your website is just blank, then typically a syntax error is the cause. Enable their display with:
error_reporting = E_ALL
display_errors = 1
In your php.ini
generally, or via .htaccess
for mod_php,
or even .user.ini
with FastCGI setups.
Enabling it within the broken script is too late because PHP can't even interpret/run the first line. A quick workaround is crafting a wrapper script, say test.php
:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Then invoke the failing code by accessing this wrapper script.
It also helps to enable PHP's error_log
and look into your webserver's error.log
when a script crashes with HTTP 500 responses.
このトピックは完全に議論されすぎている/過度に複雑になっていると思います。IDE を使用することは、構文エラーを完全に回避するための方法です。IDE なしで作業するのは、プロ意識が低いとさえ言えます。なんで?最新の IDE では、文字を入力するたびに構文がチェックされるためです。コーディング中に行全体が赤くなり、構文エラーの正確なタイプと正確な位置を示す大きな警告通知が表示された場合、別の解決策を探す必要はまったくありません。
構文チェック IDE を使用するということは、次のことを意味します。
入力したとおりに正しく表示されるため、(事実上) 構文エラーに再び遭遇することはありません。真剣に。
構文チェック付きの優れた IDE (Linux、Windows、Mac ですべて利用可能):
- NetBeans [無料]
- PHPStorm [$199 米ドル]
- Eclipse with PHP Plugin [無料]
- Sublime [$80 USD] (主にテキスト エディターですが、PHP Syntax Parserなどのプラグインで拡張可能)
予期せぬ[
最近では、[
古いバージョンの 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 5.3.10 と PHP 5.5.3 の構文エラーの予期しない '['
- PHP array() と [] の違い
- PHP 配列構文解析エラー 左角かっこ "["
ところで、古い + 遅いバージョンの PHP に本当に固執している場合は、プリプロセッサとPHP 5.4 構文のダウンコンバーターもあります。
予期[
しない構文エラーのその他の原因
PHP のバージョンが一致していない場合は、多くの場合、単純なタイプミスまたは初心者の構文ミスです。
PHP 7 であっても、classes で配列プロパティの宣言/式を使用することはできません。
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
性急に入力すると、 andfor
andforeach
ステートメントの左括弧または右括弧を忘れる可能性があります。⇓ foreach $array as $key) {
(
解決策:ステートメントと変数の間に不足している開始を追加します。⇓ if ($var = pdo_query($sql) { $result = …
中かっこは、最初に右かっこで式を
{
閉じずに、コード ブロックを開きません。if
)
Else は条件を期待しない
⇓ else ($var >= 0)
解決策: から条件を削除する
else
か、 を使用しますelseif
。閉鎖のためのブラケットが必要
⇓ function() use $var {}
解決策: を括弧で囲みます
$var
。見えない空白
「Invisible stray Unicode」(a non-breaking spaceなど) に関する参考回答で述べたように、次のような無防備なコードに対してもこのエラーが表示される場合があります。
<?php ⇐ $var = new PDO(...);
これは、ファイルの先頭や、コピー アンド ペーストされたコードでよく見られます。コードに構文の問題が含まれているように見えない場合は、hexeditor で確認してください。
こちらもご覧ください
予期しない T_IF
予期しない T_ELSEIF
予期しない T_ELSE
予期しない T_ENDIF
条件付き制御ブロックif
、elseif
および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
。IF
式では使用できませんif
驚くほどよくある新人の間違いは、print ステートメントなどの式でステートメントを使用しようとすることです。⇓ echo "<a href='" . if ($link == "example.org") { echo …
もちろん無効です。
三項条件を使用できますが、読みやすさへの影響に注意してください。
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
それ以外の場合は、そのような出力構成を分割します。複数の
if
および をecho
使用します。
さらに良いことに、一時変数を使用し、条件を前に配置します。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"; }
?:
または、三項比較に頼ってください。イフ・イン・イフ
次のいずれかの条件内で をネストする
if
ことはできません。⇓ if ($x == true and (if $y != false)) { ... }
and
(またはor
) は既に連鎖比較を許可しているため、これは明らかに冗長です。忘れた
;
セミコロン繰り返しますが、各制御ブロックはステートメントである必要があります。前のコード部分がセミコロンで終了していない場合、それは構文エラーであることが保証されています。
⇓ $var = 1 + 2 + 3 if (true) { … }
ところで、
{…}
コード ブロックの最後の行にもセミコロンが必要です。セミコロンが早すぎる
この落とし穴は見落としやすいため、特定のコーディング スタイルを非難するのはおそらく間違っています。
⇓ if ($x == 5); { $y = 7; } else ← { $x = -1; }
これは、想像以上に頻繁に発生します。
- で式を終了する
if ()
;
と、void ステートメントが実行されます。はそれ自身;
の空になります!{}
- したがって、
{…}
ブロックは から切り離され、if
常に実行されます。 - そのため
else
、 はオープン コンストラクトとの関係がなくなりましたif
。これが、予期しない T_ELSE 構文エラーにつながる理由です。
これは、この構文エラーの同様の微妙なバリエーションも説明しています。
if ($x) { x_is_true(); }; else { something_else(); };
;
コード ブロックの後に構造体{…}
全体が終了し、分岐が構文的if
に切断されます。else
- で式を終了する
コードブロックを使用しない
/ /ブランチのコード ブロックでは、中かっこ
{
…<code>} を構文的に省略できます。悲しいことに、これは、知識のないコーダーに非常に一般的な構文スタイルです。(誤った仮定の下では、これは入力または読み取りがより高速でした)。if
elseif
else
ただし、構文がつまずく可能性が非常に高くなります。遅かれ早かれ、追加のステートメントが if/else 分岐に入ります。
if (true) $x = 5; elseif (false) $x = 6; $y = 7; ← else $z = 0;
しかし、実際にコード ブロックを使用するには、それらを …<code>} のように記述する必要があります。
{
ベテランのプログラマーでさえ、この中括弧のない構文を避けるか、少なくとも規則に対する例外的な例外として理解しています。
Else / Elseif の順序が間違っている
覚えておくべきことの 1 つは、もちろん条件付き順序です。
if ($a) { … } else { … } elseif ($b) { … } ↑
elseif
s は好きなだけ持つことができますが、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 } ?>
これは多かれ少なかれ不正なインデントのバリエーションです - おそらく多くの場合、間違ったコーディングの意図に基づいています。and /構造トークンの間に他のステートメントをマッシュアップする
ことはできません。if
elseif
else
if (true) { } echo "in between"; ← elseif (false) { } ?> text <?php ← else { }
{…}
どちらも、制御構造トークン間ではなく、コード ブロックでのみ発生します。- これはとにかく意味がありません。
if
PHP がとelse
ブランチの間をジャンプするときに「未定義」の状態があったというわけではありません。 - print ステートメントがどこに属しているか、または両方のブランチで繰り返す必要があるかどうかを判断する必要があります。
また、異なる制御構造間で if/else を分割することもできません。
foreach ($array as $i) { if ($i) { … } } else { … }
との間に構文上の関係
if
はありませんelse
。foreach
レキシカル スコープは で終了するため}
、if
構造が続く意味はありません。- これはとにかく意味がありません。
T_ENDIF
予期しない T_ENDIF が表示される場合は、別の構文スタイル
if:
⋯elseif:
⋯を使用していelse:
ますendif;
。これは本当によく考えるべきです。よくある落とし穴は、不気味に似
:
たコロンを;
セミコロンと混同することです。(「セミコロンが早すぎる」でカバー)テンプレートファイルでインデントを追跡するのは難しいため、代替構文を使用すると、より多くのことが起こります. your
endif;
does not match anyif:
.使用
} 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
予期しない 予期し<
ない>
==
、>=
、===
、!=
、<>
、orなどの比較演算子は、ほとんどの場合、式などの式でのみ使用する必要があり!==
ます。パーサーがそれらについて不平を言う場合、それは多くの場合、ペアリングが正しくないか、それらの周りのかっこが一致していないことを意味します。<=
<
>
if
(
)
括弧のグループ化
特に、複数の比較を行うステートメントでは、開き括弧と閉じ括弧
if
を正しくカウントするように注意する必要があります。⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑
ここでの
if
条件は、)
比較が十分に複雑になると、それを複数のネストされた構造に分割するのに役立つことがよくあります
if
。isset() 比較でつぶす
共通の新参者は、落とし穴が結合
isset()
またはempty()
比較を試みていることです。⇓ if (empty($_POST["var"] == 1)) {
あるいは:
⇓ if (isset($variable !== "value")) {
とは変数名のみを受け入れる言語構造であるため
isset
、これは PHP には意味がありません。empty
出力は単なる/すでにブール値であるため、結果を比較することも意味がありません。>=
以上と=>
配列演算子の混同どちらの演算子も多少似ているため、混同されることがあります。
⇓ if ($var => 5) { ... }
この比較演算子は「以上」と呼ばれていることだけを覚えておいてください。
比較するものがない
同じ変数名に関連する場合、2 つの比較を組み合わせることもできません。
⇓ if ($xyz > 5 and < 100)
PHP は、初期変数を再度比較するつもりだったと推測できません。通常、式はoperator precedenceに従ってペアになっているため、 が表示さ
<
れるまでには、元の変数からブール値の結果しか残っていません。比較チェーン
演算子の行を持つ変数と比較することはできません:
⇓ $reult = (5 < $x < 10);
これは、2 つの比較に分けて、それぞれに対して
$x
.これは、実際にはブラックリストに登録された式のケースです (演算子の結合性が同等であるため)。いくつかの C スタイルの言語では構文的に有効ですが、PHP はそれを期待される比較チェーンとして解釈しません。
予想外 予想
>
外<
大なり演算子
>
または小なり演算子には、カスタムトークナイザー名<
がありません。T_XXX
そして、それらは他のすべてのように置き忘れられる可能性がありますが、パーサーが誤って引用された文字列やマッシュされた HTML について不平を言うのをよく見かけます。⇓ print "<a href='z">Hello</a>"; ↑
これは、文字列をリテラル定数と
"<a href='z"
比較してから、別の比較を行うことになります。または、少なくとも PHP はそのように認識しています。実際の原因と構文の誤りは、文字列の途中終了でした。>
Hello
<
"
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) {}
このような構文エラーは、通常、誤ってネストされた
{
andに対して発生します}
。特に、関数コード ブロックがあまりにも早く閉じられた場合。式コンテキスト内のステートメント
ほとんどの言語構造はステートメントとしてのみ使用できます。これらは、他の式の中に配置することを意図していません。
⇓ $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
のような条件を式に具体的に埋め込むには、多くの場合、?:
三項評価を使用します。同じことが
for
、while
、global
、echo
およびレッサー エクステンドにも適用されlist
ます。⇓ echo 123, echo 567, "huh?";
一方
print()
、式のコンテキストで使用できる組み込み言語です。(しかし、ほとんど意味がありません。)識別子としての予約済みキーワード
また、ユーザー定義関数またはクラス名に
do
orおよびその他の言語構造を使用することもできません。if
(おそらく PHP 7 では可能ですが、それでもお勧めできません。)制御ブロックの後に、コロン (:) または中かっこ ({) の代わりにセミコロンを使用します。
通常、制御構造は中括弧で囲みます (ただし、別の構文でコロンを使用することもできます)。誤ってセミコロンを使用すると、そのブロックが時期尚早に閉じられ、終了ステートメントでエラーがスローされます。
foreach ($errors as $error); <-- should be : or {