0

私はいくつかの PHP コードをリファクタリングしていて、ネストされた特定の組み合わせを発見しました

if () :

if () {

構文エラーを生成します。通常、この 2 つを混在させるわけではありませんが、コードを書いているときに頻繁に構文チェックを行うのが好きで、そのために構文エラーが発生し続けました。

例 - 構文エラーが生成されます:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) {
    if ( $test3 == 'A' ) {
    } else {
    }
  }
else :
  echo 'test2';
endif;

例 - 構文エラーを生成しません:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) :
    if ( $test3 == 'A' ) :
    else :
    endif;
  endif;
else :
  echo 'test2';
endif;

コードの最初のブロックがエラーを生成している理由を誰かに説明してもらえますか?

4

5 に答える 5

2

正確な理由はわかりません。これは、開発者が基本的に「それをしないでください」と言っている関連するPHPバグ投稿です:)。最近、PHP のソース コードを詳しく調べていませんが、あえて推測する必要があるとすれば、if ステートメントを再帰的に実行する際に代替構文をチェックしていないためです。

于 2008-10-07T21:38:30.717 に答える
2

私は PHP の文法に詳しくないので、これは大げさな推測です。しかし、ここに行きます:

問題は2番目elseです。パーサーは、これelseが最初または 2 番目の if (最初から数えて) に属しているかどうかを確認できません。2番目の例では、endif2番目のif-block を終了させて​​、解析を実行できるようにしています。おそらく、これは変装した有名な 'dangling-else' 問題でしょうか?

于 2008-10-07T21:25:41.227 に答える
1

インデントは気にしないでください。最初の例は、中括弧を使用する if が代替構文を使用する else と一致していると解釈しています。

ここでは一貫性が経験則であり、とにかく解釈があいまいであるため、他の回答で提案されているようにセミコロンを挿入するか、さらに良いことに...コードをクリーンアップします。それは恐ろしいです!

于 2008-10-08T03:38:57.183 に答える
1

最後の中括弧の後にセミコロンを置くとうまくいきます:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) {
    if ( $test3 == 'A' ) {
    } else {
    }
  };
else :
  echo 'test2';
endif;
于 2008-10-08T00:54:04.800 に答える
0

ここで言えることは、コードがまったく読めないということだけです。避ける:ペストのように。使い慣れた C スタイルの中かっこ構文を使用します。

コードの品質は可読性によって大きく左右されます。そのため、これをきれいにする努力をしてください。そうすれば、驚くほど多くのバグを回避できます。

于 2008-10-08T00:30:49.277 に答える