プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になります。 今回は、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はもともと必要ないのですか?
これも教えてください。
どうか、よろしくお願いします。

A 回答 (5件)

#3の回答へのレスについて・・・


見解の相違でしょうね。
そのドキュメントの作者がそういう「律儀な人」だからとしか。

実質公式サイトの解説でもついてない例文が多いですが、
ついているものもあるのでなんともいえません。
http://jp2.php.net/manual/ja/control-structures. …

前回の回答にも書きましたが
「defaultは往々にしてフローの最後」というだけで
べつにどこにきてもいいわけで、そうなると
defaultにもbreakは必要です。
そういうのを説明するのが面倒な場合は、
「とりあえずつけときなさい」って解説になるんじゃ
ないでしょうかね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/23 04:55

#4>「defaultは往々にしてフローの最後」というだけで


#4>べつにどこにきてもいいわけで、
実際に試してみたところでは、どこでもいいみたいですけど
http://jp2.php.net/manual/ja/control-structures. …
によると
”最後の case 文に置 く必要があります”
とありますね。
(C言語では、規格的にどこでもいいことになっていますが)
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/23 05:11

switchは下に流れていくだけの構造なのでbreakは


必須じゃないですよ。

ちょっと簡単に書くと(phpの書き方じゃないですが
概念的にご理解ください)
case 1
echo x
case 2
echo y
case 3
echo z
なら1の場合は、xyzと表示されてます。
場合によってはこういうこともありますよね。
breakが必須じゃないってことはわかりますか?

returnが強制的にフローをとめているのであれば
breakはあるだけ無駄です。
ちなみにdefaultは往々にしてフローの最後にくるので
breakはいらないでしょ。さすがに。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/21 15:39

waterclockさん、こんにちは。



どういった場合にreturnを使ったのでしょうか。
関数内でしょうか。インクルードなどをしたファイル内でしょうか。

returnとbreakは別のものです。

breakは制御構文(forやswitchなど)で処理を抜け出すためによく使われます。
[ http://www.php.net/manual/ja/control-structures. … ]

returnは関数で戻り値を返す場合やinclude/requireしたときの戻り値を返す場合によく使われます。
[ http://www.php.net/manual/ja/function.return.php ]

switch構文は該当した部分から以降の処理を通ります。
ですので、breakしない場合どこかで該当するものがあれば
そこから一番最後までが常に実行されます。
該当した処理だけを通すために、breakで制御構文を抜け出しています。
最後のdefaultはcaseで該当データがなければ通る処理になります。
default以降には条件判断がないと思いますのでbreakは書かなくても正常に動作します。
書くほうと書かないほうのどちらが文法的に正しいのかは分かりませんが、
私はdefaultでbreakが書かれているものを見たことがありません^^;
    • good
    • 0
この回答へのお礼

papillon68さん、回答ありがとうございます。
たぶん 全部関数内です。
function ..........()
{
switch(....){
........
}
}

>default以降には条件判断がないと思いますのでbreakは書かなくても正常に動作します。
実は、私もそう思っていたのですが、XOOPSではSwitch文は200ほどあり、
なぜか、殆ど defaultでbreakが書かれています。
だから、素人の身としてはここでもパニックになりました。

お礼日時:2006/08/21 11:56

> return は、breakを、省略できるのか、それともこれらは、等価なのか、


return文が実行された時点でその関数から抜けるので、
return文直後のbreak文が実行されることはありません。
そのため有ってもなくても同じと言うことになります。

> また、通常では、defaultでも、break が必要だとおもいますが、
> 省略?されているのも結構ありますが、breakがあるのが正解ですか?
> それとも、defaultでbreakはもともと必要ないのですか?
switch内の実行が終わるのは、
break文またはswitchブロックの終わりです。
defaultは必ず最後にかかれますから、
breakが無くてもswitchブロックの終わりで実行が終了します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/21 11:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!