2008年05月23日

PHP:文字列と数値0は等価?

いきなりですが、下記ソースの結果はどう出力されるかわかりますか?



<?php

$a = "aaa";
$b = 0;
if($a == $b)
{
echo "等しい";
}
else
{
echo "等しくない";
}

?>




答えは「等しい」です。


ええぇぇ〜〜?







わざとらしく驚きましたが、カラクリは以下の通りです。



まず、
PHPマニュアル(PHP: 比較演算子 - Manual)には、


整数値を文字列と比較する際、文字列が 数値に変換されます。


と書かれています。


ということは内部的には



<?php

if((int)"aaa" == 0)
{
echo "等しい";
}
else
{
echo "等しくない";
}

?>



という処理になっていると思われます。


PHPマニュアルのPHP: 文字列 - Manual
には
文字列の数値への変換について、

文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。

と書かれています。


ということは、

aaaや0aaaなどは0と比較すると等価と判断され、
1aaaと1の比較も等価と判断されるということですね。。

これって仕様とはいえ知っていないとどこでバグっているのかわからなくなりそうです。

で、こういった現象が起きてしまうのは、
比較演算子に==を使っている場合で、==では型まで等しいかの比較ができていないんですね。

ですのでお互いの型が違った場合、内部で無理矢理な型変換が行われてしまうわけです。

じゃあ型まで比較するにはどうすればいいかというと、普段はあまり使わないと思うのですが

===

を使います。

知ってはいても常にこれを使っている人は少ないのではないでしょうか。

==で済むものを文字列同士の比較は全て===と書く人はあまりいないでしょう。。

比較する文字列が数値型として解釈されては困る場合に限ってあらかじめ===を使うといいかもしれません。

もしくはエラーやバグの原因が==だった場合だけ===に変えるとか(笑)

いずれにしろこういった事を理解した上で、こういう場面に遭遇するのとそうでないのでは全然違うと思いますので、おぼえておいて損はないと思います。

何かしら参考になりましたらクリックをよろしくお願いします
にほんブログ村 IT技術ブログへ   人気ブログランキング    
タグ:PHP
posted by トモヒロ | Comment(2) | TrackBack(0) | PHP
この記事へのコメント
これは基本中の基本ぐらいのレベルなのでしょうか?
私にとっては難しいです・・・・

私はウェブ関係をどうにか頑張りたい、と思っているのでやるならPHPからかな、と思っているのですが
基本がまったく理解できていないです。

例えば、WPなどのプラグインやテーマはPHPで作成されていますが、
既存のものをカスタマイズするにはどうにかカンでいけるのですが
1からPHPで何かを作れ!といわれたらできない状態です。

本屋さんなどでPHPの本を立ち読みしたりするのですが、中々いい参考書にはめぐり合えず。

トモヒロさん、何かお勧めはありますか?
Posted by K子 at 2008年05月24日
>> K子さん

http://php.xenophy.com/index.html

http://www.ipc.hokusei.ac.jp/~z00104/php/index.html

http://www.phppro.jp/school/phpschool/

このあたりはどうでしょう。

基本書を買うのはもったいない気がw

わかってきたら、もっと知りたい部分が詳しく書かれている書籍を買ってみたらどうでしょうか。
Posted by トモヒロ at 2008年05月24日
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。