PHPのelseifとelse ifの違い

2018/12/28追記 この記事は2007年に書いたものです。現在は PSR-2: Coding Style Guide – PHP-FIG に従うことが多く elseif を利用するのが一般的だと思います。

Javaの次にPHPを学んだせいというか、最近PHPのソースを見たときにelseifがあって違和感に感じることがあった。

PHPでは、(単語二つで)’else if’と書くこともできます。 動作は(一単語の) ‘elseif’と同じです。文法的な意味はやや異なっています。 (あなたが C 言語に詳しいとすると、C 言語のそれと同じ動作です。) しかし、最終的な両者の動作は全く同じです。

PHP: elseif – Manual

となっているようにどちらでもちゃんと動く。挙動は同じと書いてあるので疑うことはないにしても「文法的な意味はやや異なっています」と言われると気になる。
そもそも何がどう違うのかというと、

C/C++ でよく見かける else if (condition) は言語としての仕様ではなく、個別の if then else 文が入れ子になってあたかもひとつの構文であるかのようにコーディングされているだけのものである。しかし、これは else-if がコンパイル時に効率的に処理されるのでない限り C/C++ では必要とされないことを意味している。一般に elseif は論理的には if…else の入れ子よりも単純であり、両方を用意している PHP などの言語では elseif は else if よりも効率的に処理される。

制御構造 – Wikipedia

という話で要するに

if ($hoge == 'hoge') {
} else
    if ($hoge == 'hogehoge') {
    } else
        if ($hoge == 'hogehogehoge') {
        }

ということをやっているだけで、else ifではなくてif elseの入れ子だよということだ。意識したことなかったけれど、確かに言われてみたらそうとも取れるか。zend_language_parser.cとかもチラッと見てみたけれど、ELSE_IFとして認識するような箇所はなくてIFかELSEかELSEIFかしかない。
実際のコーディング上の一般論だと何が良いのかなと思ってPEARとZendFreamworkのコーディング規約を参照してみると、PEAR :: Manual :: 制御構造ではelseifしか記述になく、Zend Framework A.4.6.1. If / Else / Elseifでは逆に

“elseif” を使用することは可能ですが、推奨されません。代わりに “else if” を使用してください。

なんてことが書いてある。実際にソースをgrepして検索してみたところPEARでは確かにelseifばかりが使われていて、ZendFrameworkでは両方が同じくらいの量が見つかった。
自分の今までみてきた日本人の書いたコードだと圧倒的にelse ifの方が多かったけれど、世の中的にはどうだろうと気になったので人力検索で質問してみた。

[追記]

elseifelse ifケースバイケース
67人66人67人

世の中的にはどうでもよいみたい。質問の仕方があまりにシンプルでよくわからずに答えた人がいるかもしれないけれど、それにしても「ケースバイケース」な人が結構いるもんだ。編集するファイルのコーディングにあわせるとか、規約に準ずるとかならわかるのだけれど、気分で使い分けているなら、どういうときの方がどっちが見やすいとかそういう論はあるのだろうか。

3件のコメント

  1. elseif , else[ブランク]if の違いを検索してたら来ました。
    IEなら見た目の違いが判るけど、Firefoxで見ると、どちらも「else[ブランク]if」に見えてしまいました。

  2. 私も普段はelse if
    なのですが
    elseifが出てきて
    ふと気になり調べてみました。
    今まで通りelse ifで行こうと思います!

  3. 検索したらトップに出てきたので書き残しておきます。

    PHPマニュアルのリンク先にもあるように
    コロンを使用する記述の場合はelseifでないといけない。
    ということで、普段からelseifで統一してます。

コメントする

メールアドレスが公開されることはありません。