4

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

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

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

re9
  • 6,698
  • 29
  • 124
  • 232
  • http://php.net/manual/ja/control-structures.elseif.php#71982 からの引用でしょうか? – unarist Jan 20 '16 at 12:02
  • はい。#付与すると、該当箇所へリンクできたんですね – re9 Jan 21 '16 at 08:47
  • PHPマニュアルのコメント欄は各コメントの投稿者名がリンクになっているので、そのURLを持ってきました。 – unarist Jan 21 '16 at 08:49

2 Answers2

6

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

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

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

OOPer
  • 19,157
  • 2
  • 16
  • 33
  • IssueもずっとOpenのままですし、PHP7でも状況は変わってないですね: Wandbox, 文法定義 – unarist Jan 20 '16 at 12:55
  • 具体的にどういうケースが駄目なのでしょうか? if():の後、elseif:を使用せずelse:を使用するとエラー? それともelse:自体が駄目? あるいはelse:する際入れ子のif文があると駄目? 最終的には文脈によるので一概には言えないのでしょうか? – re9 Jan 21 '16 at 08:55
  • 非コロン形式でelse節を持たないif文の直後にelse:またはelseif():があるとダメ、ですね。 – OOPer Jan 21 '16 at 11:58
4

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

if($b){
  echo $b;
};

// or

if($b)
  echo $b;;

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