- 2010年10月23日 18:56
- PHP
PHPには気を付けなければいけない言語仕様があります。
例えば、ショッピングサイトでカートの中身を表示させる
ページをご覧になったことがある方も多いと思います。

このページには、カートの中身の一覧から
商品の削除ができる機能が付いています。
次のコードをご覧ください。
-----------------------------------------------
if(isset($_POST['index'])){
$index = $_POST['index'];
array_splice($item, $index, 1);
$_SESSION['item'] = $item;
}
------------------------------------------------
各削除ボタンには、上から順番に「0」「1」「2」…とhiddenで
パラメータが設定されており(名前が「index」)、
どの商品を削除すれば良いかを識別できるようになっています。
上記のコードは、パラメータがあれば取得して、その番号に
該当する商品を、カートから削除しています。
ところが、上記のコードを以下のように書き換えてみると、
一番上の商品だけ削除できないという事態に!! 
-------------------------------------------------
$index = $_POST['index'];
if(!$index == ""){
array_splice($item, $index, 1);
$_SESSION['item'] = $item;
}
--------------------------------------------------
削除できないということは、
取得した値が「""」と等しいと判定されたからです。
一番上に表示されている商品の削除ボタンが押された場合、
「0」がパラメータとして渡されますので、
「0」と「""」を「==」で比較した結果、trueと判定されたことになります。 
…うーん。
PHPのマニュアルには、次のように定義されています。

赤く丸で囲んだところをご覧下さい。
「==」による「0」と「""」との比較はtrueになるのです。 
ちょっと納得いかない気もしますが、これはPHPの言語仕様として
決められているルールなのです。
ただ「!=」で「0」と「""」を比較した場合はちゃんとfalseが返ります。
先ほどのコードを次のように書き換えると、
一番上の商品も問題なく削除することができます。
-------------------------------------------------
$index = $_POST['index'];
if($index != ""){
array_splice($item, $index, 1);
$_SESSION['item'] = $item;
}
--------------------------------------------------
なんだか紛らわしいですね…。
あくまでも「==」による「穏やかな比較」の場合に、このようなことが起こるのです。
ちなみに「厳密な比較」は「===」を使用します。
ご存知の方も多くいらっしゃると思いますが、
よく記述する内容なだけに、ちょっと注意が必要かもしれません。
PHPマニュアル
http://php.net/manual/ja/types.comparisons.php
--------------------------------------------------------------------------------
パソコンスクール KENスクール船橋校 Programインストラクター
http://www.kenschool.jp/school/funabashi/index.html
KENスクールでPHPを学びたい方は、Program講座へ!
http://www.kenschool.jp/Program/index.html
