==と===の罠

PHPは変数の型のチェックがいい加減なんで、仕様をよく理解していないと変なところでハマったりします。
CakePHPのコントローラー処理で、仮に

<?php
//コントローラーで
public function view($user_id = null){
    if($user_id === 1){
       //ユーザーID1の処理
    }
}

とした場合、これは意図しない動作になります。
user_id=1のつもりで http://ドメイン名/users/view/1 にアクセスしても、if文の中に入りません。

なぜでしょうか?

実は、アクションの引数としてはいる変数は”文字列型”できます。
文字列の”1″ と 数字の1 は違うものになるので、型も含めて比較する===は、例のプログラムはif文の中に入らず、意図した動作にはなりません。

検索パラメータとしてmodelに渡す場合は、文字列だろうが数字だろうがあまり関係はありません(最終的にはSQL文になるので全部テキスト扱いになっちゃう)ので問題にはなりにくいですが、プログラム上で直接比較演算をするなどの場合は、この点を考慮しないとトラブルの素になります。

型を厳密に考慮しない==で書くという方法もありますが、できればちゃんと入力チェックをして、intval()などで型変換をしたほうが良いでしょう。

ちなみに引数に型をつけて
public function view(int $user_id = null)
としても、nullが入ってきてしまって取得できなくなってしまいます。

タイトルとURLをコピーしました