strposを使うときの注意点

こういうの、困る。

警告
この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や "" といった値を返す可能性もあります。 詳細については 論理値の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。

http://php.net/manual/ja/function.strpos.php


これはある文字列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を返せばこの問題は出ないはずだったけど、それはコーディング規約とかでアウトだったのかな。