<?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の比較も等価と判断されるということですね。。
これって仕様とはいえ知っていないとどこでバグっているのかわからなくなりそうです。
で、こういった現象が起きてしまうのは、
比較演算子に==を使っている場合で、==では型まで等しいかの比較ができていないんですね。
ですのでお互いの型が違った場合、内部で無理矢理な型変換が行われてしまうわけです。
じゃあ型まで比較するにはどうすればいいかというと、普段はあまり使わないと思うのですが
===
を使います。
知ってはいても常にこれを使っている人は少ないのではないでしょうか。
==で済むものを文字列同士の比較は全て===と書く人はあまりいないでしょう。。
比較する文字列が数値型として解釈されては困る場合に限ってあらかじめ===を使うといいかもしれません。
もしくはエラーやバグの原因が==だった場合だけ===に変えるとか(笑)
いずれにしろこういった事を理解した上で、こういう場面に遭遇するのとそうでないのでは全然違うと思いますので、おぼえておいて損はないと思います。
タグ:PHP
私にとっては難しいです・・・・
私はウェブ関係をどうにか頑張りたい、と思っているのでやるならPHPからかな、と思っているのですが
基本がまったく理解できていないです。
例えば、WPなどのプラグインやテーマはPHPで作成されていますが、
既存のものをカスタマイズするにはどうにかカンでいけるのですが
1からPHPで何かを作れ!といわれたらできない状態です。
本屋さんなどでPHPの本を立ち読みしたりするのですが、中々いい参考書にはめぐり合えず。
トモヒロさん、何かお勧めはありますか?
http://php.xenophy.com/index.html
http://www.ipc.hokusei.ac.jp/~z00104/php/index.html
http://www.phppro.jp/school/phpschool/
このあたりはどうでしょう。
基本書を買うのはもったいない気がw
わかってきたら、もっと知りたい部分が詳しく書かれている書籍を買ってみたらどうでしょうか。