がるの健忘録 このページをアンテナに追加 RSSフィード

2007-05-16

[][][]2a問題再びw

はぁい紳士淑女&そうじゃない諸君げんきか〜い?

今日は素敵ですばらしいPHPの仕様を、もっと深く掘り下げてお届けする「シリーズ 2a問題を考える」のお時間だよw

$a = 0;
switch ( $a ){
	case NULL:
	case false:
		echo 'orz';
		break;
	case 0:
		echo '(・ω・)';
		break;
}

このソースがもちろん「orz」になる理由はわかるよね?

間違っても「(・ω・)」ぢゃないよ?


でもこれを

$a = 0;
switch ( $a ){
	case 0:
		echo '(・ω・)';
		break;
	case NULL:
	case false:
		echo 'orz';
		break;
}

ってやると、もちろん「(・ω・)」になるんだ。


そうそうちなみに。

$a = 1;
switch ( $a ){
	case true:
		echo 'orz orz';
		break;
	case 0:
		echo '(・ω・)';
		break;
	case NULL:
	case false:
		echo 'orz';
		break;
}

は当然「orz orz」になるのはわかるよね?

もちろん2a問題の一環なのだから。

$a = "2a";
switch ( $a ){
	case 2:
		echo 'orz orz orz';
		break;
	case 0:
		echo '(・ω・)';
		break;
	case NULL:
	case false:
		echo 'orz';
		break;
}

でどこ通るかなんてぇのは自明の理だよね?

もちろん「case 2」だw


つまり、あれだ。

0はfalseでNULLで、それ以外のすべての値はtrueで。

"2a"は2になって、以下略。


すばらしい言語じゃないか。

何がどんな方向からどんな風にすばらしいのかは…言わせるな。政治的にまずいんだw


…知らずに使うと怖い言語だとは思うけど…まぁ…なんていうか…頭いてぇ…


追記:

2a問題は「 素晴らしき自動的な世界〜或いは「型のない」世界〜 ( http://d.hatena.ne.jp/gallu/20061108/p1 ) 」をご覧くださいませませ。

ぺ★彡ぺ★彡 2007/05/17 10:36 それはあれですね。「case 2」を「case ”2”」とか「case ”2a”」と意識してあげると…(^o^;)

gallugallu 2007/05/17 19:45 がるです。
ええおおむねYesなのですが…たとえばcaseを文字列にしても、switchで渡す引数が数値型だと、結局同じ事象がおきます(苦笑
まず「型をチェックする」という「前処理」が必須だなぁと感じる瞬間です。

JittaJitta 2007/05/17 21:56 > 0はfalseでNULLで、それ以外のすべての値はtrueで。
 0 は false で、false 以外は true。普通ですが?

gallugallu 2007/05/17 23:28 やほりです。
うん「0がtrue」とかいう恐ろしい状況ではないので(…あるのかそんな言語)、そういう意味では普通なのですが。
…まぁそも「1つの判定に型を混ぜるな」という話もあるのですが、実際問題、PHPの関数ってたとえば「正常なら数値型、異常ならboolenaでfalse」なんて戻り値もあって。
で、それを単純にswitchとかifとかで判定すると「型を無視して」ごりんごりんとこられてしまうので(苦笑
その辺の「型が曖昧ってか無考慮」なのが、怖いです(苦笑

ぽぴ王子ぽぴ王子 2007/05/18 13:47 もしかしたら初コメントでしょうか…2回目ぐらい?
ぽぴ王子と言います。どうぞよろしくお願いします。

「型が曖昧ってか無考慮」ってホントに怖いですね。無秩序というか。
これが「練りに練ったあげくオイラこういう方がいいと思ったんでお母さんに言われたけどこういう風にしました!」とかなら「…キボチワルイ」で済むんでしょうけど(済まない済まない)なんというか、あからさまに「いやーもう適当にぶちこんどけばなんでもアリアリなんじゃね?うはwww俺あたまいいwwww」みたいな感じが見えてて、やっぱり「…キボチワルイ」というかなんというか。
コーディング中にダブルクォートが抜けていたりとか、文字列を入れようとしてたところに数値を入れちゃった!てへ!とかいうのでも、気づかずにPHP先生は走り出してしまうわけですよね。それもよくわからない曖昧な判断基準のままで。
以前から拝見させていただいてますが、今回のは改めて本当に怖いと思いました。

まさをまさを 2007/05/18 13:48 PHPもperlやruby同様、Variant型で「なんとなく」動いてしまっている故の問題な訳ですね。
スクリプト言語として、5分でツールを作るときには重宝する概念ですが、まじめに作るときには型を意識したいですね(ぬぅ)

そうそう、昨日はどうもお世話になりました♪<ほとんど横で熱弁を聞いてるだけではありましたが

ぺ★彡ぺ★彡 2007/05/21 15:07 >数値型がきたら(以下略)
その場合はですね、”g”とか文字を変数の後に足してcase文ですよ!(叫)

それって型チェックするのと何が違うってのはこの際雛壇に置いておいて(ToT)と。ちなみにPHPをかばう気はないです。はぃ。(^o^;)

JittaJitta 2007/05/22 06:19 > PHPの関数ってたとえば「正常なら数値型、異常ならboolenでfalse」なんて戻り値もあって。
それは、、、「エラーコードを返す。ただし、0は正常と定義する。」とは、違うんですよねぇ???

gallugallu 2007/05/25 17:19 がるです。

> > PHPの関数ってたとえば「正常なら数値型、異常ならboolenでfalse」なんて戻り値もあって。
> それは、、、「エラーコードを返す。ただし、0は正常と定義する。」とは、違うんですよねぇ???
うい多分じたさんが連想されているのは「戻り値が signed intで、マイナスなら以下略」っていう世界だと、多分思うのですが。
「エラーならbooleanでfalse返して 正常ならintで0以上を返す」です。
ところが、大抵の場合、
$ret = hogefunction();
if (false == $ret)
と聞くと思うのですが、ここで引っかかるです。まぁ今回はswitchですが内容は一緒。
せめて、せめて
if (false === $ret) // =が三つ
と聞くことで、避けることが出来るのですが。
知ってる限りでは…”===”を使ってるケースはまれで、やはりたいていの場合”==”にしちゃってるです。
で、以下略、と。

無論コーディングのしつけの問題でもあるのですが、が、それでも…やっぱり言語仕様としてちょっと「きしょい」なぁと(苦笑

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証