- ベストアンサー
IF文の引数をクォーテーションで囲む/囲まない場合の違い
後学のために知っておきたいのですがPHP4のIF構文で、 if($a >= '0'){ $b = $a +1;} と if($a >= 0){ $b = $a +1;} のように、シングルクォーテーション(')で くくったときとくくらないときで 解釈が変わることがあるのですが (ゼロ以上とみなしてくれるときと、そうでないときがある) これらに明確な違いはあるでしょうか? ついてに、以下のようにダブルクォーテーション(")の場合にも 何か留意すべき点があればご教示いただけますと幸いです。 if($a >= "0"){ $b = $a +1;}
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
PHPの場合、''や""で囲った場合は文字列として比較されます。(C, C++, Javaなどと違って''で囲った場合でも""で囲った場合でも、どちらも同様に文字列として扱われます。) 文字列としての比較と数値としての比較の場合、前者はそれぞれの文字の文字コードで大小を比較されます。数値の場合は、数値としての大小で判定されます。 ここで注意が必要なのですが、比較する一方が数値の場合、他方も数値に変換されてから比較されます。両方とも文字列なら文字列として比較されます。 ご質問の件ですが、$aが数値変数であった場合(is_float()かis_int()が真になる場合)、ifでの比較において、'0'と比較しても、$aも一旦数値に変換されてから比較されるので、'0'と書いても0と書いても、同じ結果になります。 一方、$aが文字列だった場合(is_string()が真の場合)、文字列同士の比較となります。つまり、"0"の文字コードである48より小さい文字コードを持つ文字(!"#$%&+-*/など)で始まる文字列なら"0"より小さいと判定され、48より大きい文字コードを持つ文字で始まる文字列なら"0"より大きいと判定されます。 ちなみに4.4.1で試したところ、is_numeric()が真になるような値の場合、比較する両方が文字列だとしても、数値に変換して比較するようです。 例えば今回の質問の場合、$aが数値的なら特に問題なく動作しますが、$aが"a"なら"0"よりは大きいですが、0とは等しくなります。このあたりが気をつける点でしょうか。 特に、PHPではフォームから入ってくるものは全て文字列として扱われるので、数値しか入ってこないつもりで考えていると、数値以外の値が送られてきた場合、想定外の動作をするかもしれません。 ま、本来は、ユーザからの入力は基本的に信頼せず、必ず入力値をチェックするべきものですけどね。 ''で囲った場合と""で囲った場合の違いは、文字列中での$での変数展開や\で始まるエスケープ文字が使えるかどうかの違いで、単純な文字列として考えると、全く同じものです。
その他の回答 (2)
- EnstenCoul
- ベストアンサー率9% (21/212)
PHPはよく知らないのですが、 0 ←数字 '0' ←文字(ただし1文字) "0" ←文字(2文字以上) と使い方が分かれている気がします。 なので3番目の""は間違いだと思います。 '0'とやった場合、文字として扱われておかしくなるのかな~と思いました。
お礼
なるほど、そういう解釈でしたか。 参考になりました。ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
数値としての比較の場合、0 にすべきかと思います
お礼
ご教示ありがとうございます。 以後、留意してみます。
お礼
satohさん、詳細な解説ありがとうございました。 本当に勉強になりました。 プログラミング初心者で、このあたりがあいまい なため思うような動作にならないと 'をはずしてみたりと非効率なことをしていたの ですが、振り返ってみてなるほど、全ての挙動が ご教示の内容と一致していたように思います。 ログを保存させていただき、今後のPHP学習の参考に させていただきます。 心より御礼申し上げます。