:構文でelseを使用した時、期待した動作をしない場合があるのは何故でしょうか?

投稿者: Anonymous

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

if($a):
    echo $a;
    if($b) {
      echo $b;
    }
else:
    echo $c;
endif;

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

解決

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

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

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

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *