欠落{
または}
不正確なインデントのために
不一致のコード中括弧は、以下のようなあまりフォーマットされていないコードによく見られます。
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 …
もちろんこれは無効です。
3項条件付きを使用できますが、読みやすさへの影響に注意してください。
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
それ以外の場合は、このような出力構成を分割します。複数を使用しますif
sおよびecho
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」もvoidステートメントになります。
コードブロックで割り当てを使用する必要があります。
if ($x == $y) { $var = "true"; }
または、?:
3項比較を使用します。
イフの場合
次のいずれかを条件内にネストする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 ()
と表現し;
、それが空のステートメントを実行します。;
空になった{}
、独自の!
{…}
したがって、ブロックはから切り離され、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の順序が間違っている
もちろん、覚えておくべきことは、条件付き順序です。
if ($a) { … }
else { … }
elseif ($b) { … }
↑
はいくつでも持つことができelseif
ますが、else
最後に行く必要があります。それがまさにそれです。
クラス宣言
上記の、あなたはクラス宣言で制御ステートメントを持つことはできません。
class xyz {
if (true) {
function ($var) {}
}
関数定義を忘れたか}
、そのような場合には早く定義を閉じました。
予期しない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がブランチ
if
とelse
ブランチの間をジャンプするときに「未定義」状態があったのとは異なります。
- printステートメントがどこに属しているか、または両方のブランチで繰り返す必要があるかどうかを判断する必要があります。
また、異なる制御構造間でif / elseを分離することもできません。
foreach ($array as $i) {
if ($i) { … }
}
else { … }
何もありません統語的関係の間if
とはelse
。foreach
レキシカルスコープの端は}
、そのためにはポイントがないif
構造が継続します。
T_ENDIF
予期せぬT_ENDIFが文句を言っている場合は、別の構文を使用しているスタイルif:
⋯ elseif:
⋯ else:
⋯をendif;
。あなたは本当に二度考えるべきです。
よくある落とし穴は、不気味に似た:
コロンを;
セミコロンと混同していることです。(「セミコロンが早すぎる」で取り上げられました)
インデントはテンプレートファイルで追跡するのが難しいので、代替構文を使用する場合はさらに多くなります- endif;
一致しない可能性がありますif:
。
使用} endif;
は二重の if
ターミネーターです。
「予期しない$ end」は通常、忘れられた閉じ}
中括弧の価格です。
割り当てと比較
したがって、これは構文エラーではありませんが、このコンテキストで言及する価値はあります。
⇓
if ($x = true) { }
else { do_false(); }
これは==
/ ===
比較ではなく、=
代入です。これはやや微妙であり、一部のユーザーを無条件で条件ブロック全体を編集するように導くでしょう。最初に意図しない割り当てに注意してください-論理障害/誤動作が発生したときはいつでも。