21131


下記がエラーになるのは、何故でしょうか？

[code]

    if($a):
        echo $a;
        if($b) {
          echo $b;
        }
    else:
        echo $c;
    endif;
    
[/code]

<http://php.net/manual/ja/control-structures.elseif.php>


CC BY-SA 3.0
2016-01-20T11:47:27.387
21128
2016-01-20T13:29:02.577
7886
question
php
：構文でelseを使用した時、期待した動作をしない場合があるのは何故でしょうか？


掲載のリンクのコメント部分を参照されたのだろうと思うのですが、結論だけから言うと「PHPの構文解析器(parser)がそれをエラーにするようにプログラムされているから」と言うことになります。

現在のPHPの構文解析器は非コロン形式のif節にelseが続く場合、常にそれを非コロン形式のelseの始まりとして解釈しようとします。人間が解釈するのであれば、次にコロンが存在することとコロン形式のifが外側に存在することから容易に「このような場合は外側のコロン形式用のelseと解釈する」ことができますが、それをプログラミング言語の構文解析器にやらせるのはそれほど簡単なことではなく、構文解析器やその構文解析器の入力データとする文法がやたらと複雑化したり(場合によっては、そのためにまったく別の予想外の影響が出ることもあります)、そこら辺をなんとかクリアしたとしても構文解析自体に極端に時間がかかってしまうなどの弊害が出ることもあります。

最新のPHP7での動作は確認していないのですが、PHP開発メンバーとしては、そのようなリスクを冒してまで解決しないといけないような致命的な問題とは捉えていないので、そのような動作のままで放置しているのだと思われます。


CC BY-SA 3.0
2016-01-20T12:03:58.737
21131
2016-01-20T12:03:58.737
13972
21128
answer


本題からは離れますが、ではどの様にすればエラー無しに動作するのかと言えば、要は `if($b) ...` 部分を statement
として明示的に表現してあげれば良いかと(具体的には `if statement` の最後に `;` を付ける)。

[code]

    if($b){
      echo $b;
    };
    
    // or
    
    if($b)
      echo $b;;
    
[/code]

※ まぁ、colon 形式か brace 形式か、どちらか一方で統一した方が良いかとは思いますが…


CC BY-SA 3.0
2016-01-20T13:29:02.577
21133
2016-01-20T13:29:02.577
21128
answer