2017-12-15 6 views
2

私はPHPの学習を始めましたが、PHPのドキュメントではバグが報告されていましたが、レポートページではバグではないとのことでした。 コードは次のとおりです。double semicolon in php

$bar = 'bar'; 
$foo = 'foo'; 

if (isset($bar)): 
    if (isset($foo)) echo "Both are set."; 
elseif (isset($foo)): 
    echo "Only 'foo' is set."; 
else: 
    echo "Only 'bar' is set."; 
endif; 

我々は、中括弧内の場合はネストされたコードを置く場合は、再度、エラーが起こっています。 「:」

if (isset($bar)) : 
    if (isset($foo)) { 
      echo "Both are set."; 
    } 
elseif (isset($foo)) : 
     echo "Only 'foo' is set."; 
else : 
     echo "No one is set."; 
endif; 

上記のコードは、予期しないエラーが発生してレポートページの理由は、それが上記のコードとPHPで使用される混合構造だったバグではありませんこれを言っ許可し、私はそれを受け入れたが、何ていませんこのコードは間違っています。 しかし、ネストされたif文の最後に別のセミコロンを追加すると、完全に機能します。 またはif文の末尾にelse文を追加すると、if文のエラーがなくなります。このような 何か:

if (isset($bar)) : 
    if (isset($foo)) { 
      echo "Both are set."; 
    } else { 
      echo "this is else"; 
    } 
elseif (isset($foo)) : 
     echo "Only 'foo' is set."; 
else : 
     echo "No one is set."; 
endif; 

誰もが私はこの混合構造は本当に悪いです知っているが、問題を理解することが、別のミスを防ぐことができます助け場合、私は感謝します。 ありがとうございました。

+0

あなたが話しているページへのリンクを追加してもよろしいですか? –

+2

私は、あなたが中括弧と '' '' if ''文を混合しないようにするべきだと思います。それは[documentation](http://php.net/manual/en/control-structures.alternative-syntax .php)states –

+2

コロンが 'elseif'のように読み込まれるのは、コロンで表記された最初の' if'ステートメントの一部ではなく、実際にはコロンが二番目の 'if'の中にあるということです。このような問題を避けるための最善の策は、コントロール構造の唯一のスタイルのネストです。 – MCMXCII

答えて

0

問題はこのことです:

if (cond): 
    if (cond) stuff(); 
elseif (cond): 
    stuff(); 
else: 
    stuff(); 
endif; 

が本当にdangling-else問題のインスタンスである - elseifは空白と小文字を区別しない言語では「内側」または「外側」ifに属しているのでしょうか?

PHPこのようchooses to parseそれを "not supported" である2つの構文を、混合

if (cond): 
    if (cond) 
     stuff(); 
    elseif (cond): 
     stuff(); 
    else: 
     stuff(); 
    endif; 

だから、1はこれが(関連bug reportの結論ではありません)バグであると言うことに傾斜される可能性があります - 仕様状態:

else句が字句的に最も近いがifかの前に関連付けられていますelseifを入力します。

これもelseif条項に適用されると仮定すると、1は、他に何も許されないようパーサは、私たちの外側ifで私たちのelseifを関連付ける必要があることを言うかもしれません。


この問題は、上記の解析が不可能になる原因によって緩和されます。そのバグレポートから、最も単純な例を取る:

if (cond): 
    if (cond) stuff(); 
    ;     // <<<< 
elseif (cond): 
    stuff(); 
else: 
    stuff(); 
endif; 

余分なセミコロンがelseifは、内側if/elseif/ifチェーンの一部として解釈することができないことを意味します。この特定のコードスニペットで


1.、私は空白が重要であることをふりをしています。

+0

あなたの答えをありがとうこの質問はPHPのドキュメントに掲載されています。このページにこの回答を投稿するのは悪くありません。 – Mahdi

+0

@Mahdi - 気軽にそうしてください:)(もしそうなら、ここにリンクがあることを確認してください) –

+0

あなたはなぜelse文がセミコロンを持たない問題を修正するのか説明してもらえますか? – Mahdi