strposを使うときの注意点
こういうの、困る。
警告
http://php.net/manual/ja/function.strpos.php
この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や "" といった値を返す可能性もあります。 詳細については 論理値の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。
これはある文字列Aが文字列Bで始まっているかどうかを知りたいときに問題が表面化する。以下のコード例では$targetがHelloで始まっている場合に加え、$target内に"Hello"が存在しない場合の両者がif文の条件を満たしてしまう。
if(strpos($target,"Hello") == 0) { echo $target."はHelloという文字列から始まる"; }
0とfalseと空文字の区別が曖昧だからこういう事が起こる。プログラマの意図通り動作させるにはドキュメント通り===演算子を利用する。
if(strpos($target,"Hello") === 0) { echo $target."はHelloという文字列から始まる"; }
strposに限らず、数値とfalseを返す関数は要注意。
これ、falseを返さなくてもJavaみたいに-1を返せばこの問題は出ないはずだったけど、それはコーディング規約とかでアウトだったのかな。