• 締切済み

Switch文における、returnとbreakについて

いつもお世話になります。 今回は、switch文において質問します。 XOOPSの中のスクリプトからですが、 ■ A code: --------------- switch($esc_type){ case 'html': return htmlspecialchars($string, ENT_QUOTES, $char_set); case 'htmlall': return htmlentities($string, ENT_QUOTES, $char_set); -----(中略)------ default: return $string; } ■ B code: --------------- switch($level){ case '1': return '\part{'; break; -----(中略)------ case '6': return '\subparagraph{'; break; } というのがありますが、 質問(1) switch文には故意にbreakを書かないのちょっと別として、 return は、breakを、省略できるのか、それともこれらは、等価なのか、 それとも、やはり、returnでもbreakを書くのがいいのか、教えてください。 質問(2) また、通常では、defaultでも、break が必要だとおもいますが、 省略?されているのも結構ありますが、breakがあるのが正解ですか? それとも、defaultでbreakはもともと必要ないのですか? これも教えてください。 どうか、よろしくお願いします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#4>「defaultは往々にしてフローの最後」というだけで #4>べつにどこにきてもいいわけで、 実際に試してみたところでは、どこでもいいみたいですけど http://jp2.php.net/manual/ja/control-structures.switch.php によると ”最後の case 文に置 く必要があります” とありますね。 (C言語では、規格的にどこでもいいことになっていますが)

waterclock
質問者

お礼

どうも色々とありがとうございます。 このサイトは必須サイトですから、利用しています。 私も、ここで、defaultでbreakは要らないと思ってました。 しかしながら、Xoopsのように大勢の方が関与しているコードで、 各自癖はあるものの、ほぼ, defaultにbreakを記載しているので、 先ほども記載しましたが、害がないなら一応記載する考えに なってきました。 でも、さまざまな型があるっていうのは、素人からすれば 醜いですね。そのプログラマーさんは、たぶん人とは違う独自の 型を狙っているのかもしれませんが、一番わかりにくいのは、 if($xxx -- 0) xxxxx; elseif yyyy; else zzz; のように、{}を省略しているコードです。 どこで切れているのかすらわからない記載文もあり、 素人がクラックするにはかなり辛いものがあります。 もうちょっと、統一してほしいと思うこの頃です。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

#3の回答へのレスについて・・・ 見解の相違でしょうね。 そのドキュメントの作者がそういう「律儀な人」だからとしか。 実質公式サイトの解説でもついてない例文が多いですが、 ついているものもあるのでなんともいえません。 http://jp2.php.net/manual/ja/control-structures.switch.php 前回の回答にも書きましたが 「defaultは往々にしてフローの最後」というだけで べつにどこにきてもいいわけで、そうなると defaultにもbreakは必要です。 そういうのを説明するのが面倒な場合は、 「とりあえずつけときなさい」って解説になるんじゃ ないでしょうかね。

waterclock
質問者

お礼

情報どうもありがとうございます。 確かに、Xoopsでも、defaultが最初に記載されているものもありました。 でも、return を除くSwitch文ではdefaultが最後にあり且つbreakが ありました。おっしゃるように、疑わしきは害がないので、 default break; 型にしておいた方が無難ですね。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

switchは下に流れていくだけの構造なのでbreakは 必須じゃないですよ。 ちょっと簡単に書くと(phpの書き方じゃないですが 概念的にご理解ください) case 1 echo x case 2 echo y case 3 echo z なら1の場合は、xyzと表示されてます。 場合によってはこういうこともありますよね。 breakが必須じゃないってことはわかりますか? returnが強制的にフローをとめているのであれば breakはあるだけ無駄です。 ちなみにdefaultは往々にしてフローの最後にくるので breakはいらないでしょ。さすがに。

waterclock
質問者

お礼

回答ありがとうございます。 なるほど、故意にbreakを入れないってのもありなんですね。 そうなると、ますます return xxx; break; っていうのは変ですね。 ただXOOPSの殆どのSwitch文で default  break; があるので、Switch文は, forなどのように 無限ループが存在するのかと、悩んでしまいました。 でも、次のサイトでは、 http://www.futaba-ide.net/help/040602-switch.html 太字で、「default文の終わりにもbreak文が必要です。」と なってますね。あれーー;)

回答No.2

waterclockさん、こんにちは。 どういった場合にreturnを使ったのでしょうか。 関数内でしょうか。インクルードなどをしたファイル内でしょうか。 returnとbreakは別のものです。 breakは制御構文(forやswitchなど)で処理を抜け出すためによく使われます。 [ http://www.php.net/manual/ja/control-structures.break.php ] returnは関数で戻り値を返す場合やinclude/requireしたときの戻り値を返す場合によく使われます。 [ http://www.php.net/manual/ja/function.return.php ] switch構文は該当した部分から以降の処理を通ります。 ですので、breakしない場合どこかで該当するものがあれば そこから一番最後までが常に実行されます。 該当した処理だけを通すために、breakで制御構文を抜け出しています。 最後のdefaultはcaseで該当データがなければ通る処理になります。 default以降には条件判断がないと思いますのでbreakは書かなくても正常に動作します。 書くほうと書かないほうのどちらが文法的に正しいのかは分かりませんが、 私はdefaultでbreakが書かれているものを見たことがありません^^;

waterclock
質問者

お礼

papillon68さん、回答ありがとうございます。 たぶん 全部関数内です。 function ..........() { switch(....){ ........ } } >default以降には条件判断がないと思いますのでbreakは書かなくても正常に動作します。 実は、私もそう思っていたのですが、XOOPSではSwitch文は200ほどあり、 なぜか、殆ど defaultでbreakが書かれています。 だから、素人の身としてはここでもパニックになりました。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> return は、breakを、省略できるのか、それともこれらは、等価なのか、 return文が実行された時点でその関数から抜けるので、 return文直後のbreak文が実行されることはありません。 そのため有ってもなくても同じと言うことになります。 > また、通常では、defaultでも、break が必要だとおもいますが、 > 省略?されているのも結構ありますが、breakがあるのが正解ですか? > それとも、defaultでbreakはもともと必要ないのですか? switch内の実行が終わるのは、 break文またはswitchブロックの終わりです。 defaultは必ず最後にかかれますから、 breakが無くてもswitchブロックの終わりで実行が終了します。

waterclock
質問者

お礼

早速どうもありがとうございます。 同一人物がスクリプトを書いているのであれば、その人のくせで、 全コード同じように記載されてるんですが、XOOPSのような 複数の人が手がけてるものは、まぁ本当に色々とくせがあり、 同じswitch文内でも、returnの後にbreakがあったり、なかったりして、なんか特別な意味でもあるのかと思ってしまいます。 難しいですね。

関連するQ&A

専門家に質問してみよう