お久しぶりです。塚原です。
暑かった夏も終ってやっと秋らしくなり過ごしやすくなってきました。
最近やたら眠いですが、モリモリ開発しております。
この前ちょっとした不具合があり、なるほどねぇ~と思ったのでご共有。
数が多い分岐などに便利なswith文ですが、意外に落とし穴があるみたいです。
検索で絞り込みしたいときに書いた次のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const COUPON_UNUSED = 0; const COUPON_FINISHED = 1; const COUPON_EXPIRED = 2; $status = $_POST['status']; switch( $status ){ case COUPON_UNUSED: echo '未使用'; break; case COUPON_FINISHED: echo '使用済'; break; case COUPON_EXPIRED: echo '期限切れ'; break; } |
初期表示でパラメータがないためスルーして全件でると思いきや、、、
未使用がでる!?
調べてみると空は0と一致する扱いなのですな。。。
結局if文とisset()で書いて解決しましたが、
結構、空、NULL、0の扱いがどうなってるのというときありますよね。
よく思い出せずに混乱するので実験して備忘録。
以下のコードで
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
if( $a ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( $a == "" ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( $a == NULL ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( $a == 0 ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( $a === "" ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( $a === NULL ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( $a === 0 ){ echo 'TRUE'; } else{ echo 'FALSE'; } if( isset( $a )){ echo 'TRUE'; } else{ echo 'FALSE'; } if( empty( $a )){ echo 'TRUE'; } else{ echo 'FALSE'; } if( is_null( $a )){ echo 'TRUE'; } else{ echo 'FALSE'; } switch( $a ){ case '': echo 'TRUE'; break; default: echo 'FALSE'; } switch( $a ){ case Null: echo 'TRUE'; break; default: echo 'FALSE'; } switch( $a ){ case 0: echo 'TRUE'; break; default: echo 'FALSE'; } |
変数aを未定義、空文字、NULL、0をいれて実行してみました。
結果がこちら
未定義 | NULL | 空 | 0 | |
---|---|---|---|---|
if( $a ) | FALSE | FALSE | FALSE | FALSE |
if( $a == “” ) | TRUE | TRUE | TRUE | TRUE |
if( $a == NULL) | TRUE | TRUE | TRUE | TRUE |
if( $a == 0 ) | TRUE | TRUE | TRUE | TRUE |
if( $a === “” ) | FALSE | FALSE | TRUE | FALSE |
if( $a === NULL ) | TRUE | TRUE | FALSE | FALSE |
if( $a === 0 ) | FALSE | FALSE | FALSE | TRUE |
isset( $a ) | FALSE | FALSE | TRUE | TRUE |
empty( $a ) | TRUE | TRUE | TRUE | TRUE |
is_null( $a ) | TRUE | TRUE | FALSE | FALSE |
switch case ” | TRUE | TRUE | TRUE | TRUE |
switch case NULL | TRUE | TRUE | TRUE | TRUE |
switch case 0 | TRUE/ | TRUE | TRUE | TRUE |
==の比較演算子、empty、switchにおいてはどれもいっしょの扱いなのか!
switch文のcaseに0を使うときは、入ってくる変数によって注意が必要そうですね。
ちょっとスッキリ!それではまた~。
名の由来は「天祐」。 そのままではおこがましいので 天の字から1本棒をとればと叔父がつけてくれたもの。 名に恥じぬよう世の中の助けとなるものを創り出していきたいです。 for Facebookのサポート・運用開発の部隊に所属しています。